我需要根據某些條件將“完整”資料幀分配給另一個更大資料幀的一部分。
所以,我有兩個資料框,第一個讓我們說:
import pandas as pd
df_1 = pd.DataFrame({
'A': [0, 0, 1, 1, 2, 2],
'B': [1, 2, 3, 4, 5, 6],
'C': ['a', 'b', 'c', 'd', 'e', 'f']
})
和
df_2 = pd.DataFrame({
'A': [0, 0, 0],
'B': [5, 5, 6],
'C': ['z', 'z', 't']
})
我想做的是:
df_1.loc[df_1.A == 0][[ 'B', 'C' ]] = df_2[['B', 'C']]
在 df_1 中獲取 df_2 的值。我得到的結果是 df_1 和 A == 0 的行變成了 NaN。
我該如何解決這個問題?感謝您的回答。
uj5u.com熱心網友回復:
您使用示例資料的解決方案,因為df_1和 的前兩行之間的索引匹配df_2,在實際資料中顯然不是:
df_1.loc[df_1.A == 0, [ 'B', 'C' ]] = df_2[['B', 'C']]
print (df_1)
A B C
0 0 5 z
1 0 5 z
2 1 3 c
3 1 4 d
4 2 5 e
5 2 6 f
對于通用解決方案是更改索引,如果使用上面NaN的解決方案得到s。
您可以按 count Trues by過濾sum并分配 numpy 陣列:
df_1 = pd.DataFrame({
'A': [0, 0, 1, 1, 2, 2],
'B': [1, 2, 3, 4, 5, 6],
'C': ['a', 'b', 'c', 'd', 'e', 'f']
}, index=list('efghik'))
m = df_1.A == 0
df_1.loc[m, [ 'B', 'C' ]] = df_2[['B', 'C']].iloc[:m.sum()].to_numpy()
print (df_1)
A B C
e 0 5 z
f 0 5 z
g 1 3 c
h 1 4 d
i 2 5 e
k 2 6 f
另一個想法是重命名索引以進行匹配:
m = df_1.A == 0
df_1.loc[m, [ 'B', 'C' ]] = df_2[['B', 'C']].rename(dict(zip(df_2.index, df_1.index[m])))
print (df_1)
A B C
e 0 5 z
f 0 5 z
g 1 3 c
h 1 4 d
i 2 5 e
k 2 6 f
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/400761.html
上一篇:提取嵌套字典
