在我面臨的以下問題中,我需要您的幫助:
我有 2 個資料框(df_big 和 df_small),每一個都有很多列。在 df_small 中,每一行對于 df_big 中的列 'a'、'b'、'c'、'd'、'e' 都有唯一的組合,存在的行與 df_small 在 'a'、'b'、' 具有相同的值c'、'd'、'e' 但存在且行具有相同的 'a'、'b'、'c'、'd' 和 'e' 列中的不同值。
我想在 df_big 中與 df_small 在列 'a', 'b','c', 'd' 中具有相同值的行在列 'e' 中只有一個值。必須是來自 df_small 的值。
while i < len(df_small):
while j < len(df_big):
if ((df_big.iat[j,df_big.columns.get_loc('a')] == df_small.iat[i,df_small.columns.get_loc('a')]) &
(df_big.iat[j,df_big.columns.get_loc('b')] == df_small.iat[i,df_small.columns.get_loc('b')]) &
(df_big.iat[j,df_big.columns.get_loc('c')] == df_small.iat[i,df_small.columns.get_loc('c')]) &
(df_big.iat[j,df_big.columns.get_loc('d')] == df_small.iat[i,df_small.columns.get_loc('d')]) ):
df_big.iat[j,df_big.columns.get_loc('e')] = df_small.iat[i,df_small.columns.get_loc('e')]
else:
pass
j= j 1
i = i 1
我有很多嘗試,并且使用 if 和 iloc,但我沒有成功。有人可以幫我嗎!
uj5u.com熱心網友回復:
使用DataFrame.set_index有DataFrame.update:
np.random.seed(2021)
df_big = pd.DataFrame(np.random.randint(10, size=(7, 6)), columns=list('abcdef'))
df_small = df_big[df_big['a'].le(2)].assign(e = lambda x: x['b'] * x['e'] * 10)
print (df_big)
a b c d e f
0 4 5 9 0 6 5
1 8 6 6 6 6 1
2 5 7 1 1 5 2
3 0 3 1 0 2 6
4 4 8 5 1 6 7
5 5 6 9 5 6 9
6 2 4 3 9 2 8
print (df_small)
a b c d e f
3 0 3 1 0 60 6
6 2 4 3 9 80 8
df_big = df_big.set_index(['a','b','c','d'])
df_small = df_small.set_index(['a','b','c','d'])['e']
#if possible duplicates per a,b,c,d remove them
#df_small = df_small.drop_duplicates(['a','b','c','d']).set_index(['a','b','c','d'])['e']
df_big.update(df_small)
df_big = df_big.reset_index()
print (df_big)
a b c d e f
0 4 5 9 0 6.0 5
1 8 6 6 6 6.0 1
2 5 7 1 1 5.0 2
3 0 3 1 0 60.0 6
4 4 8 5 1 6.0 7
5 5 6 9 5 6.0 9
6 2 4 3 9 80.0 8
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399107.html
