根据条件在熊猫数据框中将一列的值提供给另一列

时间:2020-09-30 04:43:41

标签: python pandas dataframe

我有一个数据框:

df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
                   'B': [5, '-', '-', 8, 9],
                   'C': ['-', 'b', 'c', '-', 'e']})

如果df['B']df['C'],如何使用df['B']='-'中的相应值替换df['C']!= '-'中的值。

预期输出:

({'A': [0, 1, 2, 3, 4],
  'B': [5, 'b', 'c', 8, 9],
  'C': ['-', 'b', 'c', '-', 'e']})

Out

我用过:

replace = (df['B'] == '-') & (df['C'] != '-')
df['B'][replace1] = df['C']

还有什么更好的方法吗?

3 个答案:

答案 0 :(得分:4)

尝试一下:

import numpy as np 
df['B']=np.where((df['B']=='-')&(df['C']!='-'),df['C'],df['B'])

数据框看起来像:

enter image description here

答案 1 :(得分:1)

您可以使用索引来更新值,如下所示:

import pandas as pd
df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
                   'B': [5, '-', '-', 8, 9],
                   'C': ['-', 'b', 'c', '-', 'e']})

for index, row in df.iterrows():
    if(row['B'] == '-' and row['C']!='-'):
       df.loc[index,'B'] = df.loc[index,'C']

enter image description here

答案 2 :(得分:1)

您很近,请使用DataFrame.loc

replace = (df['B'] == '-') & (df['C'] != '-')
df.loc[replace, 'B'] = df['C']
print (df)
   A  B  C
0  0  5  -
1  1  b  b
2  2  c  c
3  3  8  -
4  4  9  e

我很好奇这里是否np.where更快,并且样本数据重复100000次不是:

实际数据中的数据应该有所不同,具体取决于DataFrame的长度和匹配值的数量。

df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
                   'B': [5, '-', '-', 8, 9],
                   'C': ['-', 'b', 'c', '-', 'e']})

#[500000 rows x 3 columns]
df = pd.concat([df] * 100000, ignore_index=True)

In [9]: %timeit df.loc[(df['B'] == '-') & (df['C'] != '-'), 'B'] = df['C']
60.7 ms ± 643 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [10]: %timeit df['B']=np.where((df['B']=='-')&(df['C']!='-'),df['C'],df['B'])
66 ms ± 324 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

我认为原因是np.where处理所有值,loc仅处理过滤后的值。也有带数字的混合字符串。