Python 熊猫如何将一组3的列旋转到行中
我有一个需要变换和旋转的df。每个季节有3个相关列(开始、结束和速率)。我正在寻找轴心这些列,在最后只有3列开始,结束和速度 df: 最终:Python 熊猫如何将一组3的列旋转到行中,python,pandas,transformation,linux-df,Python,Pandas,Transformation,Linux Df,我有一个需要变换和旋转的df。每个季节有3个相关列(开始、结束和速率)。我正在寻找轴心这些列,在最后只有3列开始,结束和速度 df: 最终: ID Start End Rate 1 1/1/21 1/31/21 80 1 2/1/21 2/28/21 85 1 3/1/21 3/31/21 90 1 4/1/21 4/30/21 95 如果格式前缀为,请尝试使用重塑 out = pd.DataFrame(df.values.reshap
ID Start End Rate
1 1/1/21 1/31/21 80
1 2/1/21 2/28/21 85
1 3/1/21 3/31/21 90
1 4/1/21 4/30/21 95
如果格式前缀为,请尝试使用
重塑
out = pd.DataFrame(df.values.reshape((-1,3)), columns=['start','end','rate'])
Out[419]:
start end rate
0 1/1/21 1/31/21 80
1 2/1/21 2/28/21 85
2 3/1/21 3/31/21 90
3 4/1/21 4/30/21 95
您可以将
df.filter
与pd.concat
一起使用:
In [589]: start = df.stack().filter(like='start').reset_index()[0]
In [590]: end = df.stack().filter(like='end').reset_index()[0]
In [591]: rate = df.stack().filter(like='Rate').reset_index()[0]
In [594]: x = pd.concat([start.rename('Start'), end.rename('End'), rate.rename('Rate')], 1)
假设您有2
静态列:ID,PropCode
。您可以像这样将这些列附加到x
:
In [640]: x[['ID', 'PropCode']] = df[['ID', 'PropCode']].values.tolist() * len(x)
In [641]: x
Out[641]:
Start End Rate ID PropCode
0 1/1/21 1/31/21 80 1 52032
1 2/1/21 2/28/21 85 1 52032
2 3/1/21 3/31/21 90 1 52032
3 4/1/21 4/30/21 95 1 52032
您可以从中使用该功能;目前,您必须从以下位置安装最新的开发版本:
您共享的数据具有模式(一些列以start
结尾,其他列以end
结尾,一些列以Rate
开头),我们可以使用这些模式重塑数据
# install latest dev version
# pip install git+https://github.com/ericmjl/pyjanitor.git
import janitor
df.pivot_longer(
index="ID",
names_pattern=("start$", "end$", "^Rate"),
names_to=("Start", "End", "Rate"),
)
ID Start End Rate
0 1 1/1/21 1/31/21 80
1 1 2/1/21 2/28/21 85
2 1 3/1/21 3/31/21 90
3 1 4/1/21 4/30/21 95
names\u to
采用新名称,而names\u pattern
采用模式,并相应地重塑数据。您总是希望每三列一列,还是可以随机排列?不,顺序需要保留。原始df中S1start之前有一些列,季节数不是静态的。还有一些像ID这样的静态列,我也希望保留。这是可能的吗?你能和静态COL共享一个样本,并在这种情况下发布预期的输出吗?我已经发布了屏幕截图。前7列是静态的&基本上需要复制到每一行。PropCode是主键。@我已经编辑了我的答案。请看一看,谢谢!谢谢你的帮助。
# install latest dev version
# pip install git+https://github.com/ericmjl/pyjanitor.git
import janitor
df.pivot_longer(
index="ID",
names_pattern=("start$", "end$", "^Rate"),
names_to=("Start", "End", "Rate"),
)
ID Start End Rate
0 1 1/1/21 1/31/21 80
1 1 2/1/21 2/28/21 85
2 1 3/1/21 3/31/21 90
3 1 4/1/21 4/30/21 95