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
合并似乎是最好的解决方案。如果有更好的解决办法,我会感到惊讶。