转置 Pandas 中的数据
Transposing Data in Pandas
我有一个 excel 文件,其中包含部件在其生命周期内使用次数的计数。当前数据的存储方式是序列号位于 A 列中,每个“寿命”计数存储在相邻列中,标题为“日期”值。
这是一个例子:
Image1
我希望能够 pivot/transpose Python 中的所有日期列,以便输出采用以下格式,并将寿命计数作为名为“计数”的新列:
Image2
我尝试使用 pandas 中的数据透视函数来翻转适当的行和列,但问题是我必须一次定义每一列。本示例中使用的电子表格的性质只是我使用的几个电子表格之一,它们都从不同的日期开始(有些从 01/01/2010 开始到现在,而另一些从 01/01/1999 开始到现在)。值得注意的是,所有电子表格都从每个月的第一天开始,每次递增 1 个月。
因此,有没有一种方法可以 select 我通过加载的电子表格加载到 Dataframe 中的所有列,以便能够 Pivot/Transpose 提到的数据?
pivot = df.pivot_table(index=['Serial'], values=['01/01/2019','01/02/2019',... etc], aggfunc='max'])
如果您命名您的列系列并且在您的行上有set_index()
,则简单使用stack()
。
import datetime as dt
import random
df = pd.DataFrame({**{"Serial":[s for s in range(1111,1121)]},
**{d:[random.randint(0,150) for i in range(10)] for d in pd.date_range(start=dt.date(2019,1,1), end=dt.date(2019,1,6))}
}).set_index("Serial")
df.columns.set_names("Date", inplace=True)
dfs = df.stack().to_frame().rename(columns={0:"Count"})
print(f"{df.iloc[:,:3].to_string()}\n\n{dfs.iloc[:10].to_string()}")
示例输出
Date 2019-01-01 00:00:00 2019-01-02 00:00:00 2019-01-03 00:00:00
Serial
1111 134 76 8
1112 115 37 8
1113 16 23 130
1114 108 45 69
1115 0 51 111
1116 51 71 101
1117 107 10 142
1118 80 48 134
1119 148 62 75
1120 4 135 100
Count
Serial Date
1111 2019-01-01 00:00:00 134
2019-01-02 00:00:00 76
2019-01-03 00:00:00 8
2019-01-04 00:00:00 16
2019-01-05 00:00:00 140
2019-01-06 00:00:00 28
1112 2019-01-01 00:00:00 115
2019-01-02 00:00:00 37
2019-01-03 00:00:00 8
2019-01-04 00:00:00 56
我有一个 excel 文件,其中包含部件在其生命周期内使用次数的计数。当前数据的存储方式是序列号位于 A 列中,每个“寿命”计数存储在相邻列中,标题为“日期”值。
这是一个例子:
Image1
我希望能够 pivot/transpose Python 中的所有日期列,以便输出采用以下格式,并将寿命计数作为名为“计数”的新列:
Image2
我尝试使用 pandas 中的数据透视函数来翻转适当的行和列,但问题是我必须一次定义每一列。本示例中使用的电子表格的性质只是我使用的几个电子表格之一,它们都从不同的日期开始(有些从 01/01/2010 开始到现在,而另一些从 01/01/1999 开始到现在)。值得注意的是,所有电子表格都从每个月的第一天开始,每次递增 1 个月。
因此,有没有一种方法可以 select 我通过加载的电子表格加载到 Dataframe 中的所有列,以便能够 Pivot/Transpose 提到的数据?
pivot = df.pivot_table(index=['Serial'], values=['01/01/2019','01/02/2019',... etc], aggfunc='max'])
如果您命名您的列系列并且在您的行上有set_index()
,则简单使用stack()
。
import datetime as dt
import random
df = pd.DataFrame({**{"Serial":[s for s in range(1111,1121)]},
**{d:[random.randint(0,150) for i in range(10)] for d in pd.date_range(start=dt.date(2019,1,1), end=dt.date(2019,1,6))}
}).set_index("Serial")
df.columns.set_names("Date", inplace=True)
dfs = df.stack().to_frame().rename(columns={0:"Count"})
print(f"{df.iloc[:,:3].to_string()}\n\n{dfs.iloc[:10].to_string()}")
示例输出
Date 2019-01-01 00:00:00 2019-01-02 00:00:00 2019-01-03 00:00:00
Serial
1111 134 76 8
1112 115 37 8
1113 16 23 130
1114 108 45 69
1115 0 51 111
1116 51 71 101
1117 107 10 142
1118 80 48 134
1119 148 62 75
1120 4 135 100
Count
Serial Date
1111 2019-01-01 00:00:00 134
2019-01-02 00:00:00 76
2019-01-03 00:00:00 8
2019-01-04 00:00:00 16
2019-01-05 00:00:00 140
2019-01-06 00:00:00 28
1112 2019-01-01 00:00:00 115
2019-01-02 00:00:00 37
2019-01-03 00:00:00 8
2019-01-04 00:00:00 56