Python 3.x 添加列-指定名称-基于其他列的行值

Python 3.x 添加列-指定名称-基于其他列的行值,python-3.x,pandas,Python 3.x,Pandas,我有这样一个数据帧: data = {'TYPE':['X', 'Y', 'Z'],'A': [11,12,13], 'B':[21,22,23], 'C':[31,32,34]} df = pd.DataFrame(data) TYPE A B C 0 X 11 21 31 1 Y 12 22 32 2 Z 13 23 34 我希望获得以下数据帧: TYPE A A_added B B_added C

我有这样一个数据帧:

data = {'TYPE':['X', 'Y', 'Z'],'A': [11,12,13], 'B':[21,22,23], 'C':[31,32,34]}
df = pd.DataFrame(data)

    TYPE  A   B   C
0   X     11  21  31
1   Y     12  22  32
2   Z     13  23  34
我希望获得以下数据帧:

    TYPE  A   A_added  B   B_added  C   C_added
0   X     11  15       21  25       31  35
1   Y     12  18       22  28       32  38
2   Z     13  20       23  30       34  40
对于每个列(类型列旁边),此处A、B、C:

  • 添加名为column\u name\u的新列

  • 如果类型=X加4,如果类型=Y加6,如果Z加7


Idea是由helper创建的多个值
系列
创建,使用字典创建,通过以下方式添加到列的原始和最后更改顺序:

编辑:对于不匹配的值,创建字典时会丢失值,因此如果添加字典,则会为所有其他值返回值
7

d = {'X':4,'Y':6}
cols = df.columns[:1].tolist() + [i for x in df.columns[1:] for i in (x, x + '_added')]
df1 = df.iloc[:, 1:].add(df['TYPE'].map(d).fillna(7).astype(int), axis=0).add_suffix('_added')
df2 = df.join(df1).reindex(cols, axis=1)
print (df2)
  TYPE   A  A_added   B  B_added   C  C_added
0    X  11       15  21       25  31       35
1    Y  12       18  22       28  32       38
2    Z  13       20  23       30  34       41

Idea是由helper创建的多个值
系列
,使用字典创建,添加到原始的by和列的最后更改顺序by:

编辑:对于不匹配的值,创建字典时会丢失值,因此如果添加字典,则会为所有其他值返回值
7

d = {'X':4,'Y':6}
cols = df.columns[:1].tolist() + [i for x in df.columns[1:] for i in (x, x + '_added')]
df1 = df.iloc[:, 1:].add(df['TYPE'].map(d).fillna(7).astype(int), axis=0).add_suffix('_added')
df2 = df.join(df1).reindex(cols, axis=1)
print (df2)
  TYPE   A  A_added   B  B_added   C  C_added
0    X  11       15  21       25  31       35
1    Y  12       18  22       28  32       38
2    Z  13       20  23       30  34       41

非常好,谢谢!如果我有更多的行,每行x加4,y加6,每其他行加7。没有用每个值定义字典。有解决方案吗?@anky_91-Yop,我同意,但我喜欢更一般的解决方案,所以
。pivot(*d)
如果更像3列,则会失败,所以我不使用它。非常好,谢谢!如果我有更多的行,每行x加4,y加6,每其他行加7。没有用每个值定义字典。有解决方案吗?@anky_91-Yop,我同意,但我喜欢更一般的解决方案,所以
.pivot(*d)
如果更像3列,则会失败,所以我不使用它。