![](/img/trans.png)
[英]Python Pandas Iterate over columns and also update columns based on apply conditions
[英]iterate over pandas columns based on conditions
想要根據計數、A 和 B 的值計算 C
樣品 df:
數數 | 一種 | 乙 | C |
---|---|---|---|
是的 | 23 | 2個 | 楠 |
楠 | 23 | 1個 | 楠 |
是的 | 41 | 6個 | 楠 |
我想要的結果
數數 | 一種 | 乙 | C |
---|---|---|---|
是的 | 23 | 2個 | 46 |
楠 | 23 | 1個 | 0 |
是的 | 41 | 6個 | 246 |
僅當計數值 = 是時計算 C = A*B 否則 C 值 =0 即,它應該跳過計數的 nan 值
任何幫助都是可觀的
我正在嘗試這個
for ind, row in df.iterrows():
if df['count'] == 'yes':
df.loc[ ind, 'C'] =row['A'] *row['B']
else:
df.loc[ ind, 'C'] =0
但它給出了錯誤:ValueError:系列的真值不明確。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
另外一個選擇:
df.C = df.A.mul(df.B).where(df['count'].eq('yes')).fillna(0)
df
# count A B C
#0 yes 23 2 46.0
#1 NaN 23 1 0.0
#2 yes 41 6 246.0
或者,如果您更喜歡運算符: df.C = (df.A * df.B).where(df['count'] == 'yes').fillna(0)
只需使用這個:-
df['C']=df[df['count']=='yes']['C'].fillna(value=df['A']*df['B'])
df['C']=df['C'].fillna(0)
試試這個:-
for ind, row in df.iterrows():
if row['count'] == 'yes':
df.loc[ ind, 'C'] =row['A'] *row['B']
else:
df.loc[ ind, 'C'] =0
你收到錯誤是因為你寫了df['count']=='yes'
而不是row['count'] == 'yes'
pandas 重載*
此操作,前提是您正確指定要設置的索引:
mask = df["count"].notna()
df.loc[mask, "C"] = df["A"]*df["B"]
df.C.fillna(0, inplace=True)
或者稍微更簡潔的版本會惹惱你的同事:
df["C"] = df["A"]*df["B"]*(df["count"].notna())
最后df["count"].notna()
返回一個 boolean 列,乘以數值列時,轉換為數值類型。 簡潔但清晰。
output 用於:
count A B C
0 yes 23 2 46.0
1 NaN 23 1 0
2 yes 41 6 246.0
這將比.apply
更高效,並且比iterrows 更高效。
想根據計數、A 和 B 的值計算 C
樣本df:
數數 | 一個 | 乙 | C |
---|---|---|---|
是的 | 23 | 2 | 楠 |
楠 | 23 | 1 | 楠 |
是的 | 41 | 6 | 楠 |
我想要的結果
數數 | 一個 | 乙 | C |
---|---|---|---|
是的 | 23 | 2 | 46 |
楠 | 23 | 1 | 0 |
是的 | 41 | 6 | 246 |
僅當 count 值 = yes 時計算 C = A*B 否則 C values = 0 即應該跳過 count 的 nan 值
任何幫助都是可觀的
我正在嘗試這個
for ind, row in df.iterrows():
if df['count'] == 'yes':
df.loc[ ind, 'C'] =row['A'] *row['B']
else:
df.loc[ ind, 'C'] =0
但它給出了錯誤:ValueError:一個系列的真值是模棱兩可的。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
最快的方法是np.where()
:
df['C'] = np.where(
df['count'] == 'yes', # condition
df['A'] * df['B'], # result if true
0, # result if false
)
count A B C
0 yes 23 2 46
1 NaN 23 1 0
2 yes 41 6 246
針對df = pd.concat([df] * 1000)
的所有當前答案的計時:
方法(超鏈接到 SO 答案) | %timeit (平均值 ± SD;7 次運行,每次 1K 循環) |
---|---|
np.where() |
每個循環 561 µs ± 23.9 µs |
2. * df['count'].notna() |
每個循環 642 µs ± 15.4 µs |
3. Series.where() 和fillna() |
每個循環 844 µs ± 7.89 µs |
4. loc[] 和fillna() |
每個循環 1.31 毫秒 ± 237 微秒 |
5. Series.mask() 與 isna( isna() |
每個循環 1.49 毫秒 ± 280 微秒 |
6. fillna() x2 |
每個循環 1.63 毫秒 ± 103 微秒 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.