python - 在 Pandas 中构建和旋转损坏的数据框
问题描述
我有一个从 excel 文件中读取的数据框。事情是前 4 列,它的值看起来不错。但在第 5 列数据似乎有点损坏。也就是说,像“ 2021-09-06 ”这样的“ dateID ”值变成了列,“ sourceOfData ”列变成了“值”。它看起来像这样:
国家的名字 | 省名 | 产品编号 | 产品名称 | 日期ID | 2021-09-06 | 2021-09-07 | 2021-09-08 |
---|---|---|---|---|---|---|---|
数据源 | 产品价格 | 产品价格 | 产品价格 | ||||
美国 | 纽约 | 35 | 糖 | 佣金代理1 | 2.6 美元 | 5.5 美元 | 3.4 美元 |
加拿大 | 安大略省 | 55 | 玉米 | 佣金代理1 | 2.6 美元 | 5.5 美元 | 3.4 美元 |
但我希望我的数据看起来像这样:
国家的名字 | 省名 | 产品编号 | 产品名称 | 数据源 | 日期ID | 产品价格 |
---|---|---|---|---|---|---|
美国 | 纽约 | 35 | 糖 | 佣金代理1 | 2021-09-06 | 2.6 美元 |
美国 | 纽约 | 35 | 糖 | 佣金代理1 | 2021-09-07 | 5.5 美元 |
美国 | 纽约 | 35 | 糖 | 佣金代理1 | 2021-09-08 | 3.4 美元 |
加拿大 | 安大略省 | 55 | 玉米 | 佣金代理1 | 2021-09-06 | 2.6 美元 |
加拿大 | 安大略省 | 55 | 玉米 | 佣金代理1 | 2021-09-07 | 5.5 美元 |
加拿大 | 安大略省 | 55 | 玉米 | 佣金代理1 | 2021-09-08 | 3.4 美元 |
我唯一想到的就是枢轴或融化。我开始做这样的事情:
df2 = df.melt(var_name='dateID', value_name='productPrice')
df3 = df2.iloc[1:]
为了组织日期和价格,但我被困住了。
希望我解释了我的需求。提前致谢。
对于那些想要重现我的问题并获取数据框的人,这里是包含我拥有的和需要的代码的代码。
import pandas as pd
whatIHave = {'countryName': ['','United States','Canada'],
'provinceName': ['','New York','Ontario'],
'productID': ['','35','55'],
'productName': ['', 'Sugar', 'Corn'],
'dateID': ['sourceOfData', 'CommissionAgent1', 'CommissionAgent1'],
'2021-09-06': ['productPrice','2.6$','2.6$'],
'2021-09-07': ['productPrice','5.5$','5.5$'],
'2021-09-08': ['productPrice','3.4$','3.4$']
}
df_whatIHave = pd.DataFrame(whatIHave, columns = ['countryName', 'provinceName', 'productID', 'productName', 'dateID', '2021-09-06', '2021-09-07', '2021-09-08'])
print(df_whatIHave)
whatINeed = {'countryName': ['United States','United States','United States', 'Canada', 'Canada', 'Canada'],
'provinceName': ['New York','New York','New York', 'Ontario', 'Ontario', 'Ontario'],
'productID': ['35','35','35', '55', '55', '55'],
'productName': ['Sugar', 'Sugar', 'Sugar', 'Corn', 'Corn', 'Corn'],
'sourceOfData': ['CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1'],
'dateID': ['2021-09-06', '2021-09-07', '2021-09-08', '2021-09-06', '2021-09-07', '2021-09-08'],
'productPrice': ['2.6$','5.5$','3.4$','2.6$','5.5$','3.4$']
}
df_whatINeed = pd.DataFrame(whatINeed, columns = ['countryName', 'provinceName', 'productID', 'productName', 'sourceOfData', 'dateID', 'productPrice'])
print(df_whatINeed)
解决方案
经过数小时的搜索,我设法通过将问题分成几部分并合并它们来解决这个问题。如果我们将我们的数据框考虑为 df_whatIHave:
df2 = df_whatIHave.iloc[1:, 0:6]
df2 = df2.reset_index()
columnSize = df_whatIHave.shape[1]
df3 = df_whatIHave.iloc[:, 6:columnSize]
df4 = df3.iloc[1:]
我将我的数据框分成两部分并实现了stack()函数,这对于根据日期复制我的行非常重要:
df4 = df4.stack()
df4 = df4.to_frame().reset_index()
然后我像这样合并了这两个df:
df_merged= pd.merge(df2, df4, on='index', how='inner')
推荐阅读
- tensorflow - 如何恢复cudnn lstm
- c# - 为 Outlook 2016 安装插件时出现问题
- html - 如何从右侧缩进文本?
- react-native - Expo android构建到脚本中
- flask - SQLAlchemy/Flask MSSQL Query 在 Apache 下运行时无限期挂起
- php - 类名必须是有效的对象或字符串
- c# - 如何在 C# 中为私有集设置值
- jpa - 如果 id 不在数据库中,如何在 Transaction-Scoped Persistence 上下文中找到它
- cordova - 无法在表中插入记录
- spring-boot - Spring Boot JMS Producer 中的错误:AMQ212054 目标地址被阻止