簡體   English   中英

根據條件迭代 pandas 列

[英]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 更高效。

您可以嘗試使用df.prodAB相乘,並使用df.mask屏蔽NaN值。

df['C'] = df[['A', 'B']].prod(axis=1).mask(df['count'].isna(), 0)

  count   A  B    C
0   yes  23  2   46
1   NaN  23  1    0
2   yes  41  6  246

想根據計數、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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM