使用基于条件的字典填充 Pandas 数据帧



我有一个数据帧

>> test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4], 'C': [np.nan, np.nan, np.nan, np.nan], 'D': [np.nan, np.nan, np.nan, np.nan]})
    A   B   C   D
0   a   1       
1   b   2       
2   b   3       
3   b   4       

我还有一个字典,其中b input_b表示我只修改row.A = b的行。

>> input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}

如何使用字典中的值填充数据帧以获取

    A   B   C       D
0   a   1       
1   b   2   Moon    Elephant
2   b   3       
3   b   4   Sun     Mouse

这可能不是最有效的解决方案,但据我所知,它完成了工作:

import pandas as pd
import numpy as np
test = pd.DataFrame({'A': ['a', 'b', 'b', 'b'], 'B': [1, 2, 3, 4],
                     'C': [np.nan, np.nan, np.nan, np.nan], 
                     'D': [np.nan, np.nan, np.nan, np.nan]})

input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}

for key, value in input_b.items():
    test.loc[test['B'] == key, ['C', 'D']] = value
print(test)

收益 率:

   A  B     C         D
0  a  1   NaN       NaN
1  b  2  Moon  Elephant
2  b  3   NaN       NaN
3  b  4   Sun     Mouse

如果字典input_b变得太大(更新的行太多,for 循环中的迭代太多),这会变慢,但即使有大test数据帧,小input_b也应该相对较快。

此答案还假设input_b字典中的键引用原始数据帧中B列的值,并将在CD列中添加重复值,以B列中的重复值。

使用 apply

test['C'] = test['B'].map(input_b).apply(lambda x: x[0] if type(x)==list else x)
test['D'] = test['B'].map(input_b).apply(lambda x: x[1] if type(x)==list else x)

收益 率

   A  B     C         D
0  a  1   NaN       NaN
1  b  2  Moon  Elephant
2  b  3   NaN       NaN
3  b  4   Sun     Mouse

使用 update

test=test.set_index('B')
test.update(pd.DataFrame(input_b,index=['C','D']).T)
test=test.reset_index()
test
   B  A     C         D
0  1  a   NaN       NaN
1  2  b  Moon  Elephant
2  3  b   NaN       NaN
3  4  b   Sun     Mouse

您可以将索引设置为 B 后使用loc索引:

test = test.set_index('B')
test.loc[input_b, ['C', 'D']] = list(input_b.values())
test = test.reset_index()
print(test)
   B  A     C         D
0  1  a   NaN       NaN
1  2  b  Moon  Elephant
2  3  b   NaN       NaN
3  4  b   Sun     Mouse

最新更新