給定資料:
df = pd.DataFrame({"var": ["a", "a", "b", "c"], "value": [1, 2, 1, 1]})
value_map = {
"a": {
1: "hello",
2: "something",
},
"c": {1: "another"},
}
我想創建以下內容:
| var | value | labelled |
|:------|--------:|:-----------|
| a | 1 | hello |
| a | 2 | something |
| b | 1 | 1 |
| c | 1 | another |
這可以使用:
for value in value_map:
df.loc[df["var"].eq(value), "labelled"] = df.loc[
df["var"].eq(value), "value"
].replace(value_map[value])
df["labelled"] = np.where(df["labelled"].isna(), df["value"], df["labelled"])
不過,這對我來說并不是很習慣,所以我想知道使用典型的熊貓/numpy 有什么更好的方法。
uj5u.com熱心網友回復:
您可以將字典轉換為資料框并merge:
s = pd.DataFrame(value_map).unstack()
df.merge(s.rename('labelled'),
left_on=['var', 'value'], right_index=True,
how='left')
輸出:
var value labelled
0 a 1 hello
1 a 2 something
2 b 1 NaN
3 c 1 another
假設你想通過前一列的值替換NaN的,你也可以ffill在axis=1:
var value labelled
0 a 1 hello
1 a 2 something
2 b 1 1
3 c 1 another
uj5u.com熱心網友回復:
創建Series with MultiIndex,因此可能的用途DataFrame.join:
s = pd.Series({(k1, k2):v2 for k1, v1 in value_map.items() for k2, v2 in v1.items()})
print (s)
a 1 hello
2 something
c 1 another
dtype: object
df = df.join(s.rename('labelled'), on=['var','value'])
print (df)
var value labelled
0 a 1 hello
1 a 2 something
2 b 1 NaN
3 c 1 another
或者修改@mozway 解決方案:
df = df.join(pd.DataFrame(value_map).unstack().rename('labelled'), on=['var','value'])
最后替換NaNs:
df["labelled"] = df["labelled"].fillna(df["value"])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368006.html
上一篇:查看索引是否包含在切片物件中
下一篇:使用python更改列中的值
