[英]How do i create a new column in a python dataframe using the equivalent of excel averageifs
[英]How can I create new Dataframe columns using Pandas-equivalent of Excel's SUMIFS, COUNTIFS, AVERAGEIFS functions?
我有以下accounts.csv
:
CustomerID,InvoiceID,InvoiceDate,DueDate,SettledDate,InvoiceAmount,DaysToSettle,DaysLate
1,4564,29-03-2012,28-04-2012,25-04-2012,62.68,27,0
1,7897,15-05-2012,14-06-2012,28-05-2012,77.19,13,0
1,8749,21-05-2012,20-06-2012,04-06-2012,51.65,14,0
1,4189,16-06-2012,16-07-2012,04-07-2012,64.47,18,0
2,1353,12-02-2012,13-03-2012,28-02-2012,28.21,16,0
2,4898,01-03-2012,31-03-2012,17-04-2012,48.65,47,17
2,7994,20-03-2012,19-04-2012,08-04-2012,103.64,19,0
2,4652,01-07-2012,31-07-2012,17-07-2012,42.25,16,0
2,1561,01-09-2012,01-10-2012,23-09-2012,69.55,22,0
我可以
dateparse = lambda x: pd.datetime.strptime(str(x), '%d-%m-%Y')
df = pd.read_csv('accounts.csv', parse_dates=['InvoiceDate','DueDate','SettledDate'], date_parser=dateparse)
df.sort_values(by=['CustomerID', 'InvoiceDate'])
df
將其讀入數據框:
CustomerID InvoiceID InvoiceDate DueDate InvoiceAmount SettledDate DaysToSettle DaysLate
0 1 4564 2012-03-29 2012-04-28 62.68 2012-04-25 27 0
1 1 7897 2012-05-15 2012-06-14 77.19 2012-05-28 13 0
2 1 8749 2012-05-21 2012-06-20 51.65 2012-06-04 14 0
3 1 4189 2012-06-16 2012-07-16 64.47 2012-07-04 18 0
4 2 1353 2012-02-12 2012-03-13 28.21 2012-02-28 16 0
5 2 4898 2012-03-01 2012-03-31 48.65 2012-04-17 47 17
6 2 7994 2012-03-20 2012-04-19 103.64 2012-04-08 19 0
7 2 4652 2012-07-01 2012-07-31 42.25 2012-07-17 16 0
8 2 1561 2012-09-01 2012-10-01 69.55 2012-09-23 22 0
在Excel / LibreOffice上,基於兩個或多個IF條件(例如CustomerID等於當前行,InvoiceDate小於當前行,DaysLate大於0),使用COUNTIFS
, SUMIFS
和AVERAGEIFS
函數添加新列非常容易。
其中I2
是=COUNTIFS(A:A,A2, C:C, "<"&C2, H:H,">0")
, J2
是=SUMIFS(E:E,A:A,A2,C:C,"<"&C2)
和K2
是=IFERROR(AVERAGEIFS(E:E,A:A,A2,C:C,"<"&C2),0)
。
我是Pandas的新手,我似乎無法弄清楚如何根據多種條件創建新列。 我將不勝感激任何幫助。
首先,創建一個布爾蒙版,表示要填充的情況。 然后,您可以基於該蒙版選擇性填充。
假設這是您的數據框:
import pandas as pd
df = pd.DataFrame({
'a': list(range(10)),
'b': list(range(-5, 5)),
})
您要基於a
和b
的值構建列c
。
# this is an example condition
mask = (df['a'] < df['b']) | (df['a'] <= 1)
df['c'] = None
func = lambda x: x**2
df.loc[mask, 'c'] = 42 # cases where your condition is True
df.loc[~mask, 'c'] = func(df['a']) # cases where it's False
本質上,您首先要建立條件選擇,然后對結果應用某些功能。
要獲取df[col].isnull()
空的行,請使用df[col].isnull()
。 總而言之,請使用.sum()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.