![](/img/trans.png)
[英]How do I modify the value of a pandas dataframe cell that contains a list in it?
[英]How to check if a row of a Pandas dataframe has a cell with a specific value and if it does modify the last cell?
我有一個 dataframe df
:
姓名 | 年齡_5_9 | 年齡_10_14 | 年齡_15_19 |
---|---|---|---|
愛麗絲 | 沒有骨折 | 沒有骨折 | 斷了 1 根骨頭 |
鮑勃 | 沒有骨折 | 斷了 2 根骨頭 | 沒有骨折 |
查爾斯 | 沒有骨折 | 沒有骨折 | 沒有骨折 |
當任何行在任何列age_5_9
、 age_10_14
或age_15_19
中具有值 'broke 1 bone' 或 'broke 2 bone' 時,我想創建一個為1
的列broke_a_bone
; 否則應該為0。
它應該如下所示:
姓名 | 年齡_5_9 | 年齡_10_14 | 年齡_15_19 | 破骨 |
---|---|---|---|---|
愛麗絲 | 沒有骨折 | 沒有骨折 | 斷了 1 根骨頭 | 1 |
鮑勃 | 沒有骨折 | 斷了 2 根骨頭 | 沒有骨折 | 1 |
查爾斯 | 沒有骨折 | 沒有骨折 | 沒有骨折 | 0 |
我嘗試使用.iterrows
或.apply()
但我似乎無法讓它工作。
提前致謝。
您可以使用filter
到 select “年齡”列,然后檢查每行是否有any
值不是( ne
)“沒有骨折”。
將生成的 boolean 轉換為 0/1 的 integer:
df['broke_a_bone'] = (df.filter(like='age_').ne('no bones broken')
.any(axis=1).astype(int)
)
output:
name age_5_9 age_10_14 age_15_19 broke_a_bone
0 Alice no bones broken no bones broken broke 1 bone 1
1 Bob no bones broken broke 2 bones no bones broken 1
2 Charles no bones broken no bones broken no bones broken 0
我建議將所有內容都轉換為數字:
age_cols = df.filter(like='age').columns
df[age_cols] = df[age_cols].apply(lambda x: pd.to_numeric(x.str.replace('\D', '', regex=True)).fillna(0).astype(int))
print(df)
Output:
name age_5_9 age_10_14 age_15_19
0 Alice 0 0 1
1 Bob 0 2 0
2 Charles 0 0 0
現在,我們可以輕松地對行求和!
df['num_broken'] = df[age_cols].sum(axis=1)
print(df)
# Output:
name age_5_9 age_10_14 age_15_19 num_broken
0 Alice 0 0 1 1
1 Bob 0 2 0 2
2 Charles 0 0 0 0
你可以使用 np.where (更快)
a1 = df["age_5_9"].isin(['broke 1 bone', 'broke 2 bones'])
a2 = df["age_10_14"].isin(['broke 1 bone', 'broke 2 bones'])
a3 = df["age_15_19"].isin(['broke 1 bone', 'broke 2 bones'])
df['broke_a_bone'] = np.where((a1|a2|a3), 1, 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.