第一次发布新手编码人员提出的问题,欢迎提出建议和改进。
我试图在数据框中创建一个新列。每行的新列应根据以下内容进行填充:
1)如果该行中的所有选择列均包含值“无”,则为“未知”。
2)非“无”值,如果其中一列包含该值。
在我使用的数据集中,每行只有一个非“无”值,并且列名与单元格值相同。
我知道我可以遍历每一行以在那些列中找到一个非'None'值,如果找到,则将该列值设置为该值(否则设置为'Unknown'),但是我感觉缺少一些简单的方法使这项工作。
我已经考虑过使用.loc / .iloc / .at和其他一些方法来选择值,但是我觉得自己不会接近。
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['None', 'None', 'None', 'None'],
'B': ['None', 'B', 'None', 'None'],
'C': ['None', 'None', 'C', 'None'],
'D': ['None', 'None', 'None', 'D']})
values = ['B', 'C', 'D']
#In the code below, replace the string 'This should be non-None value (B, C or D)' with an expression
df['Letter'] = pd.np.where(df[values].eq(values).any(1, skipna=True),
'This should be non-None value (B, C or D)', 'Unknown')
print(df)
A B C D Letter
0 None None None None Unknown
1 None B None None This should be non-None value (B, C or D)
2 None None C None This should be non-None value (B, C or D)
3 None None None D This should be non-None value (B, C or D)
我相信需要:
df['Letter'] = df.ne('None').dot(df.columns).replace('', 'Unknown')
#if None are not strings
#df['Letter'] = df.notna().dot(df.columns).replace('', 'Unknown')
#oldier pandas versions
#df['Letter'] = df.notnull().dot(df.columns).replace('', 'Unknown')
print(df)
A B C D Letter
0 None None None None Unknown
1 None B None None B
2 None None C None C
3 None None None D D
说明:
None
通过DataFrame.ne
(!=
)或比较得到无值的布尔掩码DataFrame.notna
:
print(df.ne('None'))
A B C D
0 False False False False
1 False True False False
2 False False True False
3 False False False True
然后DataFrame.dot
与列名一起使用:
print(df.ne('None').dot(df.columns))
0
1 B
2 C
3 D
dtype: object
最后将缺失值替换为Series.replace
:
print(df.ne('None').dot(df.columns).replace('', 'Unknown'))
0 Unknown
1 B
2 C
3 D
dtype: object
另一个解决方案:
df['Letter'] = df.replace('None', np.nan).ffill(axis=1).iloc[:, -1].fillna('Unknown')
print(df)
A B C D Letter
0 None None None None Unknown
1 None B None None B
2 None None C None C
3 None None None D D
说明:
必要时将第一个replace
字符串添加None
为缺失值:
print (df.replace('None', np.nan))
A B C D
0 NaN NaN NaN NaN
1 NaN B NaN NaN
2 NaN NaN C NaN
3 NaN NaN NaN D
转发填充缺失值:
print (df.replace('None', np.nan).ffill(axis=1))
A B C D
0 NaN NaN NaN NaN
1 NaN B B B
2 NaN NaN C C
3 NaN NaN NaN D
通过位置按位置选择最后一列DataFrame.iloc
:
print (df.replace('None', np.nan).ffill(axis=1).iloc[:, -1])
0 NaN
1 B
2 C
3 D
Name: D, dtype: object
最后将缺失值替换为Series.fillna
:
print (df.replace('None', np.nan).ffill(axis=1).iloc[:, -1].fillna('Unknown'))
0 Unknown
1 B
2 C
3 D
Name: D, dtype: object
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句