将某些格式怪异的df行更改为列

时间:2019-02-14 03:25:54

标签: python pandas dataframe

我有一个包含数千行的数据框,此示例df给出了存在的不同类型的行:

df = pd.DataFrame({'col1': ['1', '2', '2', '3'],
                  'col2': ['10', '15', '20', '30'],
                    'col3': ['cat', 'dog', 'cat', 'cat'],
                   'col4': [0.2, 0.9, 'dog', 0.5],
                  'col5': [None, None, 0.3, 'dog'],
                  'col6': [None, None, None, 0.1]})

col1col2很好。对于该行的其余部分,我希望catdogcatdog成为列标题。如果某行中存在列标题,则紧随其后的任何值都应该是该列中的值。

每一行的规则:

  • 如果一行仅包含cat,则十进制值将进入cat列(dogcatdog列 拥有None)。
  • 如果一行仅包含dog,则十进制值将进入dog列(catcatdog 列具有None)。
  • 如果一行同时具有catdog,但只有一个十进制数,则该十进制应位于catdog以及catdog下。
  • 如果某行同时具有catdog,但有两个十进制数字,则该十进制数字位于该数字之前的列下方(None下的catdog) 。

例如,在第一行中,0.2直接位于cat之后,因此它将进入该列(在{的行中包含110 {1}})。

第三行col1/col2在“ 0.3cat”之后,因此dog进入所有列:0.3,{{1 }}和cat

所需的输出:

dog

1 个答案:

答案 0 :(得分:1)

使用np.selectnp.where

cond1 = (df['col3']=='cat') & (df['col4']!='dog')
cond2 = (df['col3']=='cat') & (df['col4']=='dog')
cond3 = df['col3']=='dog'
cond4 = df['col5']=='dog'
cond5 = df['col4']=='dog'

df['cat'] = np.select([cond1, cond2], [df['col4'], df['col5']], None)
df['dog'] = np.select([cond3,cond4,cond5], [df['col4'], df['col6'], df['col5']], None)
df['catdog'] = np.where(cond2, df['col5'], None)

df.drop(['col3','col4','col5','col6'], axis=1, inplace=True)
print(df)

输出:

 col1 col2   cat   dog   catdog                                                                                                   
0    1   10  0.2   None  None                                                                                                   
1    2   15  None  0.9   None                                                                                                   
2    2   20  0.3   0.3   0.3                                                                                                   
3    3   30  0.5   0.1   None 
相关问题