如何比较浮动类型的3对pandas数据帧列?

时间:2017-01-19 12:38:36

标签: python pandas dataframe

我想比较3个不同的一对数据帧。在我的数据框列中,某些值不是浮点类型,即","介于这些值之间,所以我想删除","从那些值,然后我想将这些列转换为浮点类型。最后一步是比较三对不同的数据框架列。

数据帧:

         aaa float_type1 float_type2 float_type3 float_type4 float_type5 float_type6
0  abc        1.12       1.120        1.20         1.2        1,67         167
1  xyz       1,2.5        2.35        1.25         125        12,5        12.5
2  pqr        3.56        3.58        35.6        3.78        3.90        5.56
3  pqr         5.5         5.8        5.05       5.005       5.500      5,5.78
4  pqr         6.6         6.9        6.06        6.06        6.60       6.600

计划:

def float_type_format(arg):

    arg = arg.replace(',', '')
    return arg

data = {'aaa' :{0:'abc',1:'xyz',2:'pqr',3:'pqr',4:'pqr'},
    'float_type1' :{0:'1.12',1:'1,2.5',2:'3.56',3:'5.5',4:'6.6'},
    'float_type2' :{0:'1.120',1:'2.35',2:'3.58',3:'5.8',4:'6.9'},
    'float_type3' :{0:'1.20',1:'1.25',2:'35.6',3:'5.05',4:'6.06'},
    'float_type4' :{0:'1.2',1:'125',2:'3.78',3:'5.005',4:'6.06'},
    'float_type5' :{0:'1,67',1:'12,5',2:'3.90',3:'5.500',4:'6.60'},
    'float_type6' :{0:'167',1:'12.5',2:'5.56',3:'5,5.78',4:'6.600'}}

df1 = pd.DataFrame(data)

#removing "," from float values    
df1['float_type1'] = df1['float_type1'].apply(float_type_format)
df1['float_type2'] = df1['float_type2'].apply(float_type_format)
df1['float_type3'] = df1['float_type3'].apply(float_type_format)
df1['float_type4'] = df1['float_type4'].apply(float_type_format)
df1['float_type5'] = df1['float_type5'].apply(float_type_format)
df1['float_type6'] = df1['float_type6'].apply(float_type_format)


#converting dtype into float 
df1.float_type1 = df1.float_type1.astype('float')
df1.float_type2 = df1.float_type2.astype('float')
df1.float_type3 = df1.float_type3.astype('float')
df1.float_type4 = df1.float_type4.astype('float')
df1.float_type5 = df1.float_type5.astype('float')
df1.float_type6 = df1.float_type6.astype('float')

删除","从列值I' m跟随上面的逻辑。

问题1:

他们是否有任何快速的表现和良好的方式来消除","来自专栏。

现在我想将float_type1与float_type2进行比较,将float_type3与float_type4进行比较,将float_type5与float_type6进行比较,如果所有3对都相等,则只有结果列包含true,预期输出如下:

aaa  float_type1  float_type2  float_type3  float_type4  float_type5  \
0  abc         1.12         1.12          1.2          1.2        167.0   

   float_type6 result  
0        167.0   True 

问题2:

我想要一种强有力的方法来执行此比较。

2 个答案:

答案 0 :(得分:2)

您可以replace使用regex=True来大大简化您的代码。然后,您可以使用pd.to_numeric转换为数字,然后您可以使用一些布尔逻辑获取结果列。

df2 = df1.replace(',','',regex=True)
df2 = df2.apply(pd.to_numeric, errors='ignore')

df2['result'] = ((df2['float_type1'] == df2['float_type2']) & 
                 (df2['float_type3'] == df2['float_type4']) & 
                 (df2['float_type5'] == df2['float_type6']))

   aaa  float_type1  float_type2  float_type3  float_type4  float_type5  \
0  abc         1.12         1.12         1.20        1.200        167.0   
1  xyz        12.50         2.35         1.25      125.000        125.0   
2  pqr         3.56         3.58        35.60        3.780          3.9   
3  pqr         5.50         5.80         5.05        5.005          5.5   
4  pqr         6.60         6.90         6.06        6.060          6.6   

   float_type6 result  
0       167.00   True  
1        12.50  False  
2         5.56  False  
3        55.78  False  
4         6.60  False 

答案 1 :(得分:0)

import numpy as np
import pandas as pd

def float_type_format(arg):

    arg = arg.replace(',', '')
    return arg

data = {'aaa' :{0:'abc',1:'xyz',2:'pqr',3:'pqr',4:'pqr'},
    'float_type1' :{0:'1.12',1:'1,2.5',2:'3.56',3:'5.5',4:'6.6'},
    'float_type2' :{0:'1.120',1:'2.35',2:'3.58',3:'5.8',4:'6.9'},
    'float_type3' :{0:'1.20',1:'1.25',2:'35.6',3:'5.05',4:'6.06'},
    'float_type4' :{0:'1.2',1:'125',2:'3.78',3:'5.005',4:'6.06'},
    'float_type5' :{0:'1,67',1:'12,5',2:'3.90',3:'5.500',4:'6.60'},
    'float_type6' :{0:'167',1:'12.5',2:'5.56',3:'5,5.78',4:'6.600'}}

df1 = pd.DataFrame(data)
print(df1.head(6))

#removing "," from float values    
df1['float_type1'] = df1['float_type1'].apply(float_type_format)
df1['float_type2'] = df1['float_type2'].apply(float_type_format)
df1['float_type3'] = df1['float_type3'].apply(float_type_format)
df1['float_type4'] = df1['float_type4'].apply(float_type_format)
df1['float_type5'] = df1['float_type5'].apply(float_type_format)
df1['float_type6'] = df1['float_type6'].apply(float_type_format)



#converting dtype into float 
df1.float_type1 = df1.float_type1.astype('float')
df1.float_type2 = df1.float_type2.astype('float')
df1.float_type3 = df1.float_type3.astype('float')
df1.float_type4 = df1.float_type4.astype('float')
df1.float_type5 = df1.float_type5.astype('float')
df1.float_type6 = df1.float_type6.astype('float')



df1['test'] = (df1['float_type1']==df1['float_type2']) & (df1['float_type3']==df1['float_type4']) & (df1['float_type5']==df1['float_type6'])
print(df1.head(6))

我花了一段时间才意识到你拥有所有的df1 [' float_type1']  在替换部分中,从而使整个数据帧相同。洛尔

这是我提出的方式,可能不是最好的方法。

   aaa  float_type1  float_type2  float_type3  float_type4  float_type5  \
0  abc         1.12         1.12         1.20        1.200        167.0   
1  xyz        12.50         2.35         1.25      125.000        125.0   
2  pqr         3.56         3.58        35.60        3.780          3.9   
3  pqr         5.50         5.80         5.05        5.005          5.5   
4  pqr         6.60         6.90         6.06        6.060          6.6   

   float_type6   test  
0       167.00   True  
1        12.50  False  
2         5.56  False  
3        55.78  False  
4         6.60  False