Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如果数据帧中的多个列具有除一个特定字符串以外的任何值,则设置新列值_Python_Pandas - Fatal编程技术网

Python:如果数据帧中的多个列具有除一个特定字符串以外的任何值,则设置新列值

Python:如果数据帧中的多个列具有除一个特定字符串以外的任何值,则设置新列值,python,pandas,Python,Pandas,第一次发布来自新手程序员的问题,欢迎提出建议和改进 我正在尝试在dataframe中创建一个新列。 每行的新列应按照以下要求填充: 1) 如果该行中的select列均包含值“None”,则为“未知” 2) 如果其中一列包含此类值,则为非“None”值 在我使用的数据集中,每行只有一个非“None”值(如果有的话),并且列名与单元格值相同 我知道我可以在每一行中循环查找这些列中的非“None”值,如果找到,则将列值设置为该值(否则设置为“Unknown”),但我觉得我缺少了一些简单的方法来实现这一

第一次发布来自新手程序员的问题,欢迎提出建议和改进

我正在尝试在dataframe中创建一个新列。 每行的新列应按照以下要求填充:

1) 如果该行中的select列均包含值“None”,则为“未知”

2) 如果其中一列包含此类值,则为非“None”值

在我使用的数据集中,每行只有一个非“None”值(如果有的话),并且列名与单元格值相同

我知道我可以在每一行中循环查找这些列中的非“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
说明

通过比较(
!=
)或以下各项,获取no
None
值的布尔掩码:

然后与列名称一起使用:

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)