Python:如果数据帧中的多个列具有除一个特定字符串以外的任何值,则设置新列值
第一次发布来自新手程序员的问题,欢迎提出建议和改进 我正在尝试在dataframe中创建一个新列。 每行的新列应按照以下要求填充: 1) 如果该行中的select列均包含值“None”,则为“未知” 2) 如果其中一列包含此类值,则为非“None”值 在我使用的数据集中,每行只有一个非“None”值(如果有的话),并且列名与单元格值相同 我知道我可以在每一行中循环查找这些列中的非“None”值,如果找到,则将列值设置为该值(否则设置为“Unknown”),但我觉得我缺少了一些简单的方法来实现这一点 我已经研究过使用.loc/.iloc/.at和其他一些方法来选择值,但是我觉得我还没有接近Python:如果数据帧中的多个列具有除一个特定字符串以外的任何值,则设置新列值,python,pandas,Python,Pandas,第一次发布来自新手程序员的问题,欢迎提出建议和改进 我正在尝试在dataframe中创建一个新列。 每行的新列应按照以下要求填充: 1) 如果该行中的select列均包含值“None”,则为“未知” 2) 如果其中一列包含此类值,则为非“None”值 在我使用的数据集中,每行只有一个非“None”值(如果有的话),并且列名与单元格值相同 我知道我可以在每一行中循环查找这些列中的非“None”值,如果找到,则将列值设置为该值(否则设置为“Unknown”),但我觉得我缺少了一些简单的方法来实现这一
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
说明:
通过比较(!=
)或以下各项,获取noNone
值的布尔掩码:
然后与列名称一起使用:
print(df.ne('None').dot(df.columns))
0
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
说明:
如有必要,将第一个字符串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
按位置选择最后一列:
最后,将缺少的值替换为:
尝试:
但是不要…另一个解决方案更好,我将在这里让您看看如何使用apply来实现它。String…它是strings。。。(并且axis=1)感谢您的建议:)我使用的实际数据帧中有更多的列,因此我成功地使用了第二个解决方案。非常感谢您的帮助和易于理解的解释!
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
print (df.replace('None', np.nan).ffill(axis=1).iloc[:, -1])
0 NaN
1 B
2 C
3 D
Name: D, dtype: object
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
df['new_col'] = df.apply(lambda x: [item for item in x if item!='None'][0] if len([item for item in x if item!='None'])>0 else 'Unknown',axis=1)