簡體   English   中英

如何使用等效於Excel的SUMIFS,COUNTIFS,AVERAGEIFS函數的Pandas創建新的Dataframe列?

[英]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),使用COUNTIFSSUMIFSAVERAGEIFS函數添加新列非常容易。

libreoffice_screenshot

其中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)),
})

您要基於ab的值構建列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.

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