【问题标题】:format excel data into database format with pandas - data cleaning使用 pandas 将 excel 数据格式化为数据库格式 - 数据清洗
【发布时间】:2021-09-04 02:13:45
【问题描述】:

想知道这种类型的数据清理是否已经在 pandas 中完成。 我有以下数据框(列继续有更多日期,但这是一个示例)


d = {'Date' : ["Spiderman total",
"Division A",
"Division B",
"Division C",
"Superman total",
"Division A",
"Division B",
"Division C"
],
'1/4/20': [3,1,2,0,10,5,3,2],
'1/11/20':[5,2,1,2,8,4,4,0],
'1/18/20': [15,7,7,1,20,10,0,10]

}
df = pd.DataFrame(data=d)

我想将该数据帧转换成这种格式(这是 20 年 1 月 4 日的一个示例,但最终希望获得初始数据帧中的所有日期)

 b = {'date':['1/4/20','1/4/20','1/4/20','1/4/20','1/4/20','1/4/20'],'Business':['Spiderman','Spiderman','Spiderman','Superman','Superman','Superman'],
'Division':['A','B','C','A','B','C'],
'totals':[1,2,0,5,3,2]}
dt = pd.DataFrame(data=b) 

不需要业务总数,因为它可以作为部门的总和获得,但我必须将名称(在这种情况下例如蜘蛛侠)放在业务列中。

我想知道这在 pandas 中是否可行,或者我应该尝试其他方法。

【问题讨论】:

  • 你真的有 Excel 中的数据吗?

标签: python pandas dataframe


【解决方案1】:

通过一些后期和预处理,您可以使用 Pandas 中的melt 来根据需要转换数据。

import pandas as pd

d = {
    "Date": [
        "Spiderman total",
        "Division A",
        "Division B",
        "Division C",
        "Superman total",
        "Division A",
        "Division B",
        "Division C",
    ],
    "1/4/20": [3, 1, 2, 0, 10, 5, 3, 2],
    "1/11/20": [5, 2, 1, 2, 8, 4, 4, 0],
    "1/18/20": [15, 7, 7, 1, 20, 10, 0, 10],
}
df = pd.DataFrame(data=d)

df["Business"] = df["Date"][df["Date"].str.endswith("total")]

df = df.fillna(method="ffill")

df = df[~df["Date"].str.endswith("total")]

df = df.melt(id_vars=["Business", "Date"])

df.columns = ["Business", "Division", "Date", "Totals"]

df = df[["Date", "Business", "Division", "Totals"]]

df["Business"] = df["Business"].str.split(" ").str[0]
df["Division"] = df["Division"].str.split(" ").str[1]

print(df)
Date Business Division Totals
0 1/4/20 Spiderman A 1
1 1/4/20 Spiderman B 2
2 1/4/20 Spiderman C 0
3 1/4/20 Superman A 5
4 1/4/20 Superman B 3
5 1/4/20 Superman C 2
6 1/11/20 Spiderman A 2
7 1/11/20 Spiderman B 1
8 1/11/20 Spiderman C 2
9 1/11/20 Superman A 4
10 1/11/20 Superman B 4
11 1/11/20 Superman C 0
12 1/18/20 Spiderman A 7
13 1/18/20 Spiderman B 7
14 1/18/20 Spiderman C 1
15 1/18/20 Superman A 10
16 1/18/20 Superman B 0
17 1/18/20 Superman C 10

注意,如果此数据实际上在 Excel 中,您可以使用 Power Query(数据>获取和转换)来执行此操作。

【讨论】:

  • 谢谢!什么神啊!哈哈,代码就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多