如何正确地从一些不同的列中提取数据?

时间:2019-06-14 09:27:22

标签: python pandas dataframe

我尝试从某些列中提取数据并将其合并到新列中。我有熊猫数据框:

col1 col2 col3 col4 
 A    No   No   No
 A    No   No   No
 A    No   No   No
 No   No   No   D
 No   B    No   No
 No   No   C    No
 No   No   C    No

我想获得新的专栏,例如:

col1 col2 col3 col4 targetCol
 A    No   No   No     A
 A    No   No   No     A
 A    No   No   No     A
 No   No   No   D      D
 No   B    No   No     B
 No   No   C    No     C
 No   No   C    No     C

我尝试使用lambda和简单条件,但是它不起作用。一些无效的代码:

df['targetCol'] = df['A'] if df_razm['A'] != 'No' else None

错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

谢谢您的建议。

5 个答案:

答案 0 :(得分:3)

replace上将maxaxis=1一起使用

df['targetCol'] = df.replace('No', '').max(axis=1)

  col1 col2 col3 col4 targetCol
0    A   No   No   No         A
1    A   No   No   No         A
2    A   No   No   No         A
3   No   No   No    D         D
4   No    B   No   No         B
5   No   No    C   No         C
6   No   No    C   No         C

答案 1 :(得分:2)

这是使用argmax的一种方法:

df['targetCol'] = df.values[df.index, df.ne('No').values.argmax(1)]

   col1 col2 col3 col4 targetCol
0    A   No   No   No         A
1    A   No   No   No         A
2    A   No   No   No         A
3   No   No   No    D         D
4   No    B   No   No         B
5   No   No    C   No         C
6   No   No    C   No         C

答案 2 :(得分:2)

您可以使用justify

df=df.assign(target=justify(df.values,invalid_val='No')[:,0])

  col1 col2 col3 col4 target
0    A   No   No   No      A
1    A   No   No   No      A
2    A   No   No   No      A
3   No   No   No    D      D
4   No    B   No   No      B
5   No   No    C   No      C
6   No   No    C   No      C

答案 3 :(得分:1)

尝试:

df['targetCol'] = df.replace("No", np.NaN).apply(lambda x: x.str.cat(), 1)

答案 4 :(得分:1)

也许您可以将apply与自定义功能一起使用:

def extract_value(x,invalid_value):
    return x[x!=invalid_value].values[0]

df["target_column"]=df.apply(func=extract_value,axis=1,invalid_value="No")