我有一個系列和一個 DataFrame:
Series:
1 128
2 112
3 110
Series 索引表示月份的位置
DataFrame
month c1 c2
0 1 a 0
1 2 a 0
2 3 a 0
3 1 b 0
4 2 b 0
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
我想應用系列的值,以便月份匹配,但僅限于 c1 具有特定值的地方。
我嘗試使用
df = ...
series = ...
df.loc[df['c1'] == 'a', 'c2'] = series
但這不起作用,因為它不使用月份作為索引。我怎樣才能讓它考慮DataFrame中的月份?
Expected Result (c1 = a):
month c1 c2
0 1 a 128
1 2 a 112
2 3 a 110
3 1 b 0
4 2 b 0
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
另外,如果我用同一系列申請c1==b,預期的結果是這樣的(因為沒有第3個月,只有5個月)
Expected Result (c1 = b):
month c1 c2
0 1 a 0
1 2 a 0
2 3 a 0
3 1 b 128
4 2 b 112
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
uj5u.com熱心網友回復:
為了在兩側使用按Series.map列映射獲得更好的性能過濾器,如果不匹配,則用引數month替換缺失值:Series.fillnadowncast='int'
m = df['c1'] == 'a'
df.loc[m, 'c2'] = df.loc[m, 'month'].map(series).fillna(0, downcast='int')
print (df)
month c1 c2
0 1 a 128
1 2 a 112
2 3 a 110
3 1 b 0
4 2 b 0
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
m = df['c1'] == 'b'
df.loc[m, 'c2'] = df.loc[m, 'month'].map(series).fillna(0, downcast='int')
print (df)
month c1 c2
0 1 a 0
1 2 a 0
2 3 a 0
3 1 b 128
4 2 b 112
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
uj5u.com熱心網友回復:
IIUC,使用map轉換序列中的值,并fillna處理可能缺失的值,然后分配,它將自動從索引對齊:
df.loc[df['c1'] == 'b', 'c2'] = df['month'].map(series).fillna(0)
或者,在兩側切片:
mask = df['c1'] == 'b'
df.loc[mask, 'c2'] = df.loc[mask, 'month'].map(series).fillna(0)
輸出:
month c1 c2
0 1 a 0
1 2 a 0
2 3 a 0
3 1 b 128
4 2 b 112
5 5 b 0
6 1 c 0
7 2 c 0
8 1 d 0
9 2 d 0
uj5u.com熱心網友回復:
另一種方法是將您的系列轉換為 df,并將其合并到原始 df,然后用 0 填充 nas,如下所示(并在 join_df 中更改 'c1' 之后的 'a' 以更改您想要的字母加入):
join_df = pd.DataFrame({'month':series.index,
'c1':['a']*len(series),
'c2':series})
df[['month', 'c1']].merge(join_df, on=['month', 'c1'], how='left').fillna(0)
輸出:
month c1 c2
0 1 a 128.0
1 2 a 112.0
2 3 a 110.0
3 1 b 0.0
4 2 b 0.0
5 5 b 0.0
6 1 c 0.0
7 2 c 0.0
8 1 d 0.0
9 2 d 0.0
對于'b',它輸出:
month c1 c2
0 1 a 0.0
1 2 a 0.0
2 3 a 0.0
3 1 b 128.0
4 2 b 112.0
5 5 b 0.0
6 1 c 0.0
7 2 c 0.0
8 1 d 0.0
9 2 d 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461312.html
