python - pandas 将宽数据更改为长数据,后缀从负数变为正数

标签 python pandas

我是编码新手,我希望得到帮助,使用 Pandas 将宽格式的数据转换为长格式。 但是使用 pd.wide_to_long 没有达到我想要的输出

我有什么:

How it looks in Wide format

但是我需要这种格式:

How it should look in Long format

我已经尝试过 pd.wide_to_long(df, ['quarter_'],'Deal_Number', 'quarter_to_date') 但它给我的最好的结果是 'quarter_to_date' 列仅从 0 到4 且不包括负数(-4 到 -1)

我还尝试将带有双下划线“__”的列重命名为“_-”,但它仍然不包含它们。

无法弄清楚如何做到这一点,甚至尝试将 suffix='\w|\d+' 添加到函数中。

最佳答案

不幸的是,wide_to_long 不支持负值,因此需要其他解决方案。

#change column names
df = (df.rename(columns={'quarter':'quarter_0'})
       .rename(columns = lambda x: x.replace('__','_-')))

#create MultiIndex with column with no quarters
df = df.set_index(['Deal_Number','AcquierName_clean'])
#create MultiIndex in columns
df.columns = df.columns.str.split('_', expand=True)
#reshape by stack
df = df.stack().reset_index().rename(columns={'level_2':'quarter_'})
#convert column to integers
df['quarter_'] = df['quarter_'].astype(int)
#if necessary sorting
df = df.sort_values(['Deal_Number','AcquierName_clean','quarter_'])
<小时/>
print (df)
    Deal_Number AcquierName_clean  quarter_  quarter
3             0             BankA        -4   198009
2             0             BankA        -3   198012
1             0             BankA        -2   198103
0             0             BankA        -1   198106
4             0             BankA         0   198109
5             0             BankA         1   198112
6             0             BankA         2   198203
7             0             BankA         3   198206
8             0             BankA         4   198209
12            1             BankB        -4   198106
11            1             BankB        -3   198109
10            1             BankB        -2   198112
9             1             BankB        -1   198203
13            1             BankB         0   198206
14            1             BankB         1   198209
15            1             BankB         2   198212
16            1             BankB         3   198303
17            1             BankB         4   198306
21            2             BankC        -4   198206
20            2             BankC        -3   198209
19            2             BankC        -2   198212
18            2             BankC        -1   198303
22            2             BankC         0   198306
23            2             BankC         1   198309
24            2             BankC         2   198312
25            2             BankC         3   198403
26            2             BankC         4   198406

关于python - pandas 将宽数据更改为长数据,后缀从负数变为正数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131210/

相关文章:

python - 如何在 pandas 的特定位置添加列?

python - 无法在for循环中创建pandas数据框

python - 如何使用pysftp将字符串写入ftp上的文件?

python - 获取长向量中最小值索引的有效方法,python

python - 在包含 'X' 的列中,检查并删除包含 'Y' 的行

python - 使用 pandas dataframes data python 创建堆叠直方图

python - 尝试为 Python 安装 Pandas

python - PyCharm 无法识别已安装的模块 (cx_oracle)

python - Windows 上的 TensorFlow 版本 1.0.0-rc2 : "OpKernel (' op: "BestSplits" device_type: "CPU"') for unknown op: BestSplits"with test code

python - 使用时间、日期、timedelta