我有以下字典和資料框:
val_dict = {
'key1': ['val1', 'val2', 'val3'],
'key2': ['val4', 'val5']
}
df = pd.DataFrame(data={'val5': [True, False, False],
'val2': [False, True, False],
'val3': [True, True, False],
'val1': [True, False, True],
'val4': [True, True, False],
'val6': [False, False, True]},
index=pd.Series([1, 2, 3], name='index'))
| 指數 | 值5 | 值2 | val3 | 值1 | val4 | val6 |
|---|---|---|---|---|---|---|
| 1 | 真的 | 錯誤的 | 真的 | 真的 | 真的 | 錯誤的 |
| 2 | 錯誤的 | 真的 | 真的 | 錯誤的 | 真的 | 錯誤的 |
| 3 | 錯誤的 | 錯誤的 | 錯誤的 | 真的 | 錯誤的 | 真的 |
我如何從左側遍歷資料框,以便如果該列是True,則val_dict值中的其他列變為False?
| 指數 | 值5 | 值2 | val3 | 值1 | val4 | val6 |
|---|---|---|---|---|---|---|
| 1 | 真的 | 錯誤的 | 真的 | 錯誤的 | 錯誤的 | 錯誤的 |
| 2 | 錯誤的 | 真的 | 錯誤的 | 錯誤的 | 真的 | 錯誤的 |
| 3 | 錯誤的 | 錯誤的 | 錯誤的 | 真的 | 錯誤的 | 真的 |
例如,索引 1 具有val5as True,因此val4切換到False因為它們都分配給相同的val_dict鍵。同樣,val2is Falsebut val3is True,所以val1轉向False。請注意,它應該跳過val6。
我嘗試轉換df為字典df.to_dict('index')以使用兩個字典。但是,字典是無序的,列的順序很重要,所以我認為這可能會使代碼出錯。
uj5u.com熱心網友回復:
一種方法是結合分配和掩碼:
# either val2 or val3 can be True:
com = df.filter(['val2', 'val3']).sum(1).ge(1)
# val2 is the leftmost, so start with that
(df.assign(**df.filter(['val1', 'val3']).mask(df.val2, False))
# next is the combination of val2 and val3
.assign(val1 = lambda df: df.val1.mask(com, False),
val4 = lambda df: df.val4.mask(df.val5, False))
)
Out[84]:
val5 val2 val3 val1 val4 val6
index
1 True False True False False False
2 False True False False True False
3 False False False True False True
請注意, val6 未受影響,因此值保持不變。
uj5u.com熱心網友回復:
這是我嘗試轉換為字典的方法:
def section_filter(df, section_dict):
result = {}
for index, vals in df.to_dict('index').items():
lst = []
for val in section_dict.values():
lst.append({k:v for k, v in vals.items() if k in val})
for k, v in vals.items():
if k not in [m for mi in section_dict.values() for m in mi]:
lst.append({k: v})
for l in lst:
for i in l:
if l[i]:
l.update({k:False for k in l.keys()})
l[i] = True
break
result[index] = {k: v for d in lst for k, v in d.items()}
return pd.DataFrame.from_dict(result, orient='index', columns=df.columns)
print(df)
print()
print(section_filter(df, val_dict))
val5 val2 val3 val1 val4 val6
index
1 True False True True True False
2 False True True False True False
3 False False False True False True
val5 val2 val3 val1 val4 val6
1 True False True False False False
2 False True False False True False
3 False False False True False True
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/343416.html
上一篇:'float'物件沒有屬性'something'錯誤
下一篇:重置熊貓資料框中的索引計數
