Python 将列名作为具有相同列值的新列获取

Python 将列名作为具有相同列值的新列获取,python,pandas,calculated-columns,Python,Pandas,Calculated Columns,我的数据框架与此类似: name hobby date country 5 10 15 20 ... Toby Guitar 2020-01-19 Brazil 0.1245 0.2543 0.7763 0.2264 Linda Cooking 2020-03-05 Italy 0.5411 0.2213 Na

我的数据框架与此类似:


name    hobby   date         country      5           10           15         20 ...
Toby    Guitar  2020-01-19    Brazil     0.1245       0.2543      0.7763     0.2264
Linda   Cooking 2020-03-05    Italy      0.5411       0.2213      Nan        0.3342
Ben     Diving  2020-04-02    USA        0.8843       0.2333      0.4486     0.2122
...
我想复制int列,复制它们,并将int作为列的新值,如下所示:


name    hobby   date         country      5      5     10      10     15     15    20      20...
Toby    Guitar  2020-01-19    Brazil     0.1245  5     0.2543  10    0.7763  15   0.2264   20
Linda   Cooking 2020-03-05    Italy      0.5411  5     0.2213  10    Nan     15   0.3342   20
Ben     Diving  2020-04-02    USA        0.8843  5     0.2333  10    0.4486  15   0.2122   20
...

我不知道如何解决这个问题并寻找想法

这是一个你可以尝试的解决方案

digits_ = pd.DataFrame(
    {col: [int(col)] * len(df) for col in df.columns if col.isdigit()}
)

pd.concat([df, digits_], axis=1)


我不确定这是否是用重复的列名组织数据的最佳方式。我建议将其堆叠(融化)成长格式

df.melt(id_vars=["name", "hobby", "date", "country"])
结果

    name       hobby    date        country variable    value
0   Toby       Guitar   2020-01-19  Brazil  5           0.1245
1   Linda      Cooking  2020-03-05  Italy   5           0.5411
2   Ben        Diving   2020-04-02  USA     5           0.8843
3   Toby       Guitar   2020-01-19  Brazil  10          0.2543
4   Linda      Cooking  2020-03-05  Italy   10          0.2213
5   Ben        Diving   2020-04-02  USA     10          0.2333
6   Toby       Guitar   2020-01-19  Brazil  15          0.7763
7   Linda      Cooking  2020-03-05  Italy   15          Nan
8   Ben        Diving   2020-04-02  USA     15          0.4486
9   Toby       Guitar   2020-01-19  Brazil  20          0.2264
10  Linda      Cooking  2020-03-05  Italy   20          0.3342
11  Ben        Diving   2020-04-02  USA     20          0.2122

以下是另一个带有和的选项:

dupes={f'{col}}:如果col.isdigit()},df.columns中col的int(col)
df=df.assign(**重复)。重命名(列=重复)
#姓名爱好日期国家5 10 15 20 5 10 15 20
#0托比吉他2020-01-19巴西0.12450.2543 0.7763 0.2264 5 10 15 20
#1 Linda Cooking 2020-03-05意大利0.5411 0.2213 Nan 0.3342 5 10 15 20
#2本潜水2020-04-02美国0.8843 0.2333 0.4486 0.2122 5 10 15 20
如果希望复制列位于原始列旁边,请包括:

dupes={f'{col}}:如果col.isdigit()},df.columns中col的int(col)
df=df.assign(**重复)
df=df.reindex(反转(排序(df.columns)),轴=1)。重命名(columns=dupes)
#姓名爱好日期国家5 5 20 15 10 10
#0托比吉他2020-01-19巴西5 0.1245 20 0.2264 15 0.7763 10 0.2543
#1 Linda Cooking 2020-03-05意大利5 0.5411 20 0.3342 15南10 0.2213
#2本潜水2020-04-02美国5 0.8843 20 0.2122 15 0.4486 10 0.2333

您可以将pandas插入(…)功能与for循环结合使用

将numpy导入为np
作为pd进口熊猫
df=pd.数据帧([['Toby','Guitar','2020-01-19','Brazil',0.1245,0.2543,0.7763,0.2264],
[Linda',Cooking',2020-03-05',Italy',0.5411,0.2213,np.nan,0.3342],
[本”,“潜水”,“2020-04-02”,“美国”,0.8843,0.2333,0.4486,0.2122],
列=[‘姓名’、‘爱好’、‘日期’、‘国家’、5、10、5、20])
start_col=4
对于范围内的i(0,长度(测向列)-起始列):
dcol=df.columns[start_col+i*2]#要复制的数字col名称
插入(起始列+i*2+1,dcol,[dcol]*len(df.index),True)
结果:

    name    hobby        date country       5  ...  10       5  5      20  20
0   Toby   Guitar  2020-01-19  Brazil  0.1245  ...  10  0.7763  5  0.2264  20
1  Linda  Cooking  2020-03-05   Italy  0.5411  ...  10     NaN  5  0.3342  20
2    Ben   Diving  2020-04-02     USA  0.8843  ...  10  0.4486  5  0.2122  20

[3 rows x 12 columns]
我假设您的所有列都是从第5位开始的数字,但如果不是,您可以在for循环中添加if条件以防止出现这种情况:

start\u col=4
对于范围内的i(0,长度(测向列)-起始列):
dcol=df.columns[start_col+i*2]#要复制的数字col名称
如果类型(dcol)为int:
插入(起始列+i*2+1,dcol,[dcol]*len(df.index),True)

检查列是否可以强制转换为整数变量。如果是,则创建一个值等于整数的新列。
    name    hobby        date country       5  ...  10       5  5      20  20
0   Toby   Guitar  2020-01-19  Brazil  0.1245  ...  10  0.7763  5  0.2264  20
1  Linda  Cooking  2020-03-05   Italy  0.5411  ...  10     NaN  5  0.3342  20
2    Ben   Diving  2020-04-02     USA  0.8843  ...  10  0.4486  5  0.2122  20

[3 rows x 12 columns]