csv 如何在Pandas中按多列对数据进行分组?

ttisahbt  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(155)

我有一个茶叶出口公司的CSV文件,我已经导入到Jupyter和文件的示例输出如下所示。

Date        Type    Weight   Quantity       Price
2016-01-01  black   bags     1734136.51     1131.30
2016-01-01  black   bulk     10722389.66    510.86
2016-01-01  green   4g_1kg   6817078.01     588.72
2016-01-01  instant 1kg_3kg  86444.50       565.91
2016-01-01  black   3kg_5kg  1003986.73     552.39

我希望在第一列得到一个按每个月分组的输出,然后在下一列输入,然后在下一列输入类别权重,在下一列输入每个数量的总和,就像这样。

YearMonth    Type       Weight     Quantity       Price
201601       black      bags       17341          1131.30
                        1kg_3kg    107223         510.86
                        3kg_5kg    107223         510.86
             green      bulk       107223         510.86
                        1kg_3kg    107223         510.86
                        3kg_5kg    107223         510.86
             instant    4g_1kg     6817078.01     588.72
                        3kg_5kg    107223         510.86
                        3kg_5kg    107223         510.86
201602       black      1kg_3kg    86444.50       565.91

这是我到目前为止尝试过的代码,但我不知道如何按类型和权重类一起分组。

# to get the date and convert it to YEARMONTH format
data['Date'] = pd.to_datetime(data['Date']).dt.date
data['YearMonth'] = data['Date'].map(lambda date: 100*date.year + date.month)

# calculate the total each month
data = data.groupby(['YearMonth'])['Quantity'].sum().reset_index()
data

它向我展示了这样的东西

YearMonth   Quantity
0   201601      23478578.08
1   201602      22988482.20
2   201603      25909619.24
3   201604      21687809.15
4   201605      20776964.81

有没有什么办法可以通过将它们全部分组来实现这一点?

hmmo2u0o

hmmo2u0o1#

您可以通过以下方式来完成此操作:

1)创建您的DataFrame,我使用了您提供的虚拟数据,但为了查看结果,我更改了2个月:

# Create a dictionary of data for the DataFrame
data = {'Date': ['2016-01-01', '2016-01-01', '2016-02-01', '2016-02-02', '2016-01-01'],
        'Type': ['black', 'black', 'green', 'instant', 'black'],
        'Weight': ['bags', 'bulk', '4g_1kg', '1kg_3kg', '3kg_5kg'],
        'Quantity': [1734136.51, 10722389.66, 6817078.01, 86444.50, 1003986.73],
        'Price': [1131.30, 510.86, 588.72, 565.91, 552.39]}
# Create the DataFrame
df = pd.DataFrame(data)

2)使用日期列将DataFrame.index转换为datetime

df.index = pd.to_datetime(df["Date"],format='%Y-%m-%d')

3)相应地对 Dataframe 进行分组和聚合:

df = df.groupby(by=[df.index.year, df.index.month, 'Type', 'Weight']).agg({'Quantity':'sum', 'Price':'first'})

4)将您的index.names重命名为正确的名称:

df.index.names = ['Year', 'Month', 'Type', 'Weight']

结果如下:

+------+------+-------+--------+------------+-------+
|  Year| Month|   Type|  Weight|    Quantity|  Price|
+------+------+-------+--------+--------------------+
|  2016|     1|  black| 3kg_5kg|  1003986.73| 552.39|
|      |      |       |    bags|  1734136.51| 1131.3|
|      |      |       |    bulk| 10722389.66| 510.86|
|      |     2|  green|  4g_1kg|  6817078.01| 588.72|
|      |      |instant| 1kg_3kg|    86444.50| 565.91|
+------+------+------+---------+------------+-------+
我看到您使用了reset_index,因此您也可以在此处使用它来获得以下结果:
df.reset_index()

+-+------+------+-------+--------+------------+-------+
| |  Year| Month|   Type|  Weight|    Quantity|  Price|
+-+------+------+-------+--------+--------------------+
|0|  2016|     1|  black| 3kg_5kg|  1003986.73| 552.39|
|1|  2016|     1|  black|    bags|  1734136.51| 1131.3|
|2|  2016|     1|  black|    bulk| 10722389.66| 510.86|
|3|  2016|     2|  green|  4g_1kg|  6817078.01| 588.72|
|4|  2016|     2|instant| 1kg_3kg|    86444.50| 565.91|
+-+------+------+------+---------+------------+-------+

注意,如果不想保留旧索引,可以使用df.reset_index(drop=True)

相关问题