我正在使用 df.iterrows() 來完成以下任務。
下表中的 Col3 基于 col1 和 col2 中的值。
------ ------ -------
| col1 | col2 | col3 |
------ ------ -------
| 1 | A | White |
| 1 | B | Green |
| 2 | A | Blue |
| 2 | B | Red |
------ ------ -------
這是我正在使用的代碼,它需要一段時間,因為 DataFrame 有很多行。
for i, r in df.iterrows():
if r.col1 == "1" and r.col2 == "A":
value = "White"
elif r.col1 == "1" and r.col2 != "B":
value = "Green"
elif r.col1 == "2" and r.col2 == "A":
value = "Blue"
elif r.col1 == "2" and r.col2 != "B":
value = "Red"
else:
value = None
df.loc[i, 'col3'] = value
我相信一定有更好的方法,但到目前為止我的搜索還沒有成功。
uj5u.com熱心網友回復:
我認為最好的方法是使用字典來映射值,然后merge:
d = {(1, 'A'): 'White', (1, 'B'): 'Green', (2, 'A'): 'Blue', (2, 'B'): 'Red'}
out = df.merge(pd.Series(d, name='col3'), left_on=['col1', 'col2'],
right_index=True, how='left')
如果 col3 列已經存在:
df['col3'] = df.merge(pd.Series(d, name='col3'), left_on=['col1', 'col2'],
right_index=True, suffixes=('_', None))['col3']
輸出:
col1 col2 col3
0 1 A White
1 1 B Green
2 2 A Blue
3 2 B Red
uj5u.com熱心網友回復:
使用numpy.select:
import numpy as np
conditions = [df["col1"].eq(1)&df["col2"].eq("A"),
df["col1"].eq(1)&df["col2"].eq("B"),
df["col1"].eq(2)&df["col2"].eq("A"),
df["col1"].eq(2)&df["col2"].eq("B")]
choices = ["White", "Green", "Blue", "Red"]
df["col3"] = np.select(conditions, choices, None)
uj5u.com熱心網友回復:
一個可能性能較差的解決方案是創建一個聚合列并使用 map 來翻譯它:
df['col3'] = (df.col1.astype(str) df.col2).map({'1A':"White", '1B':"Green", '2A':"Blue", '2B':"Red"})
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/486561.html
下一篇:無法拆分列的兩個值
