2014-09-03 62 views
0

我有一個熊貓數據幀:包含小數點細胞重命名列的值

import pandas as pd 
import numpy as np 

data = {'name': ['Bill', np.nan, 'Tony', 'Koli', 'Sally'], 
    'score': [42.32, np.nan, 36.3, 24.522, 73.1], 
    'age': [2, np.nan, 8, 4, 11]} 
df = pd.DataFrame(data, columns = ['name','score', 'age']) 
df 

我想數據[「分數」]的名稱更改爲數據[「score_decimal」]如果它包含一個缺失值或一個十進制數。

在僞代碼:

for each column in df: 
    if column contains np.nan's or decimals: 
     then column.name = column.name + '_decimal' 
    else: 
     do nothing 

我可以做基本的循環,但我不能做正則表達式搜索(在循環中的「如果」行)

回答

1

這是失落的一角?

contains_nan_dec = False 
for value in df['score'].unique(): 
    if value.isdigit() or value is np.nan: 
     contains_nan_dec = True 
     break 
if contains_nan_dec: # pseudocode starts here 
    then column.name = column.name + '_decimal' 
else: 
    do nothing 
+0

是否可以這樣做:if value.isregex([0-9] +(\。[0-9] [0-9]?)?)或值是np.nan – Anton 2014-09-03 20:43:15

+0

我無法告訴你提供的正則表達式是否完全正確。如果它是正確的,那麼當然,你可以這樣做。 – PawelP 2014-09-04 05:06:56

0

我相信檢索每列的值,檢查小數或NaN,然後​​更改列名更容易。首先,我將創建一個函數做檢查

def check(list): 
    for elem in list: 
     if type(elem) != type('a'): 
      if type(elem) == type(1.1) or np.isnan(elem): 
       return True 
    return False 

然後我會做類似

labels = list(df.columns) 

for i in xrange(len(labels)): 
    if check(list(df[labels[i]])): 
     labels[i] += '_decimal' 
df.columns = labels 

要非常簡潔重命名你能做到這一點的列

+0

剛注意到np.isnan()將不適用於str輸入。所以你應該添加一個初步檢查,如果它是str。 – Inox 2014-09-03 20:49:02

+0

不會.isdigit()找到年齡(整數)列和分數列(十進制) – Anton 2014-09-03 20:51:32

+0

是的,只是改變看是否類型==浮法 – Inox 2014-09-03 20:51:58

0

這樣的:

float_columns = df.columns[df.dtypes == 'float64'] 
new_names = {old_name: old_name + '_decimal' for old_name in float_columns} 
df = df.rename(columns=new_names) 

numpy.nan也被認爲是float64所以這會也覆蓋這種情況。