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

Python 使用基于条件的字典填充数据帧,python,pandas,dataframe,assign,Python,Pandas,Dataframe,Assign,我有一个数据帧 >> 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

我有一个数据帧

>> 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       
我还有一个字典,其中
input\u b
中的
b
表示我只修改
row.a=b
中的行

>> input_b = {2: ['Moon', 'Elephant'], 4: ['Sun', 'Mouse']}
如何使用字典中的值填充DataFrame以获取

    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循环中的迭代次数太多),这将变得更慢,但是对于较小的
input_b
,即使对于较大的
test
数据帧,速度也应该相对较快


此答案还假设
input\u b
字典中的键引用原始数据帧中
b
列的值,并将在
C
D
列中为
b
列中的重复值添加重复值。

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

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循环中的迭代次数太多),这将变得更慢,但是对于较小的
input_b
,即使对于较大的
test
数据帧,速度也应该相对较快


此答案还假设
input\u b
字典中的键引用原始数据帧中
b
列的值,并将在
C
D
列中添加重复值,以获得
b
列中的重复值。

使用
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

使用
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
后,可以使用索引:

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
将索引设置为
B
后,可以使用索引:

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

使用
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

使用
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

我知道如何做到这一点,首先将字典转换为数据帧,然后将其与第一个数据帧合并。但是,如果第一个数据帧(test)比我希望修改的部分大得多,那么这个过程会变得非常缓慢。我认为使用
pd将字典转换为数据帧。从dict(你的字典)
开始,然后与
input\b
合并似乎是最好的解决方案。如果有更好的解决方案,我会感到惊讶。我知道如何做到这一点,首先将字典转换为数据帧,然后将其与第一个数据帧合并。但是,如果第一个数据帧(test)比我希望修改的部分大得多,那么这个过程会变得非常缓慢。我认为使用
pd将字典转换为数据帧。从dict(你的字典)
开始,然后与
input\b
合并似乎是最好的解决方案。如果有更好的解决办法,我会感到惊讶。