Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按日期和总和列分组_Python_Pandas_Numpy - Fatal编程技术网

Python 按日期和总和列分组

Python 按日期和总和列分组,python,pandas,numpy,Python,Pandas,Numpy,我有一个dataframe,它的设计选择很差,如下所示: df = pd.DataFrame({ 'Day': ['2021-03-01', '2021-03-01', '2021-03-02', '2021-03-02', '2021-03-03'], 'Name': ['Sam', 'Sam', 'Jack', 'Steve', 'Steve'], 'Fruit':['Apple', 'Apple', 'Banana', 'Apple', 'Banana'],

我有一个dataframe,它的设计选择很差,如下所示:

df = pd.DataFrame({
    'Day': ['2021-03-01', '2021-03-01', '2021-03-02', '2021-03-02', '2021-03-03'],
    'Name': ['Sam', 'Sam', 'Jack', 'Steve', 'Steve'],
    'Fruit':['Apple', 'Apple', 'Banana', 'Apple', 'Banana'],
    '2021-03-01':['2', '1', '0', '1', '1'],
    '2021-03-02': ['3', '5', '4', '2', '1'],
    '2021-03-03':['7', '3', '2', '1', '4']})

df
          Day   Name   Fruit 2021-03-01 2021-03-02 2021-03-03
0  2021-03-01    Sam   Apple          2          3          7
1  2021-03-01    Sam   Apple          1          5          3
2  2021-03-02   Jack  Banana          0          4          2
3  2021-03-02  Steve   Apple          1          2          1
4  2021-03-03  Steve  Banana          1          1          4

我希望,对于
Day
中的每个日期,对应于与
Day
的值具有相同列名的列中的日期,将其他变量分组并按总和进行聚合。 例如,如果
Day
值为'2021-03-01',则在'2021-03-01'列中,我将求和这些值(此列中的苹果nr和香蕉nbr)

它希望结果数据帧如下所示:

         Date   Name  nrApples  nrBananas
0  2021-03-01    Sam         3          0
1  2021-03-02   Jack         0          4
2  2021-03-02  Steve         2          0
3  2021-03-03  Steve         0          4
问题是我有很多这样的日期列,我不知道如何检查
Day
列中的值是否与列的名称相同,并聚合它的值。 谢谢你的帮助

def fn(x):
    return (
        x.set_index("Fruit")
        .loc[:, x.Day.iat[0]]
        .astype(int)
        .groupby(level=0)
        .sum()
        .to_dict()
    )


df = (
    df.groupby(["Day", "Name"])
    .apply(fn)
    .apply(pd.Series)
    .add_prefix("nr")
    .reset_index()
    .fillna(0)
)
print(df)
印刷品:

          Day   Name  nrApple  nrBanana
0  2021-03-01    Sam      3.0       0.0
1  2021-03-02   Jack      0.0       4.0
2  2021-03-02  Steve      2.0       0.0
3  2021-03-03  Steve      0.0       4.0

融化列,将
Day
列与
变量
列进行比较,该列包含天数、分组依据、聚合(总和)、取消堆栈和重置索引:

(df
 .melt(['Day', 'Name', 'Fruit'])
 .loc[lambda df: df.Day.eq(df.variable)]
 .astype({"value": int})
 .groupby(['Day', 'Name', 'Fruit'])['value']
 .sum()
 .unstack(fill_value = 0)
 .add_prefix("nr")
 .reset_index()
 .rename_axis(columns = None)
 )
 
Fruit         Day   Name  nrApple  nrBanana
0      2021-03-01    Sam        3         0
1      2021-03-02   Jack        0         4
2      2021-03-02  Steve        2         0
3      2021-03-03  Steve        0         4

它工作得很好谢谢你!!如果我想对所有日期列求和,你知道我是否可以修改它吗?(无论
日期
是否相同)您都应该能够修改和。如果您有任何问题,请询问。