Python 熊猫-创建基于列值插入新行的表?
我有一个数据框,其中包含一个项目的名称、项目上的数据,然后是竞争对手的数据,所有数据都在一行中:Python 熊猫-创建基于列值插入新行的表?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,其中包含一个项目的名称、项目上的数据,然后是竞争对手的数据,所有数据都在一行中: name value1 value2 ex_value1 ex_value2 jim 0.4 0.6 0.7 0.3 tim 0.2 0.8 0.766666667 0.233333333 john 1 0 0.5
name value1 value2 ex_value1 ex_value2
jim 0.4 0.6 0.7 0.3
tim 0.2 0.8 0.766666667 0.233333333
john 1 0 0.5 0.5
paul 0.9 0.1 0.533333333 0.466666667
我要做的是创建一个新表,该表按名称包含索引,但根据竞争对手的数据插入新行,以便显示jim、ex jim、tim、ex tim等:
name value1 value2
jim 0.4 0.6
tim 0.2 0.8
john 1 0
paul 0.9 0.1
ex_jim 0.7 0.3
ex_tim 0.766666667 0.233333333
ex_john 0.5 0.5
ex_paul 0.533333333 0.466666667
我该怎么做呢?我是否必须在名称上设置索引,然后以这种方式插入新名称?我会通过一个循环来了解这件事吗?感谢您的指导您可以使用concat执行此操作
df_ex = df[['name','ex_value1', 'ex_value2']].rename(columns = {'ex_value1': 'value1', 'ex_value2': 'value2'})
df_ex['name'] = 'ex_' + df_ex['name']
pd.concat([df[['name','value1', 'value2']], df_ex ]).round(2)
name value1 value2
0 jim 0.40 0.60
1 tim 0.20 0.80
2 john 1.00 0.00
3 paul 0.90 0.10
0 ex_jim 0.70 0.30
1 ex_tim 0.77 0.23
2 ex_john 0.50 0.50
3 ex_paul 0.53 0.47
我建议将您的数据帧拆分为两个,然后再将其合并在一起。比如:
import pandas as pd
df = pd.DataFrame([['jim', .4, .6, .7, .3], ['john', 1, 0, .5, .5]], columns=['name', 'value1', 'value2', 'ex_value1', 'ex_value2'])
ex_df = df.copy()
ex_df['name'] = 'ex_'+ex_df['name'].astype(str)
ex_df = ex_df[['name', 'ex_value1', 'ex_value2']]
ex_df.columns = ['name', 'value1', 'value2']
df = df[['name', 'value1', 'value2']]
frames = (df, ex_df)
new = pd.concat(frames).reset_index()
new = new[['name', 'value1', 'value2']]
print(new)
#output
name value1 value2
0 jim 0.4 0.6
1 john 1.0 0.0
2 ex_jim 0.7 0.3
3 ex_john 0.5 0.5
你可以去
def myfunc(row):
return pd.Series({'name': 'ex_{}'.format(row['name']),
'value1': row['ex_value1'],
'value2': row['ex_value2']})
df2 = df[~df['name'].astype(str).str.startswith('ex_')].apply(myfunc,axis =1)
df = pd.concat([df[['name', 'value1', 'value2']], df2])
这将仅将函数myfunc
应用于name
不以ex
开头的行myfunc()
返回一个新的数据帧,然后将其连接到df
对于单班轮爱好者(虽然不可取,但事实上):
您可以使用和的组合 这给了你
variable value1 value2
0 ex_jim 0.700000 0.300000
1 ex_john 0.500000 0.500000
2 ex_paul 0.533333 0.466667
3 ex_tim 0.766667 0.233333
4 jim 0.400000 0.600000
5 john 1.000000 0.000000
6 paul 0.900000 0.100000
7 tim 0.200000 0.800000
我想重新创建df,您可以在末尾添加
reset\u index()
pd.DataFrame(df.iloc[:,1:].values.reshape(8,2),index=['','ex_']*4+df.name.repeat(2),columns=['value1','value2'])
Out[986]:
value1 value2
name
jim 0.400000 0.600000
ex_jim 0.700000 0.300000
tim 0.200000 0.800000
ex_tim 0.766667 0.233333
john 1.000000 0.000000
ex_john 0.500000 0.500000
paul 0.900000 0.100000
ex_paul 0.533333 0.466667
这是一个很好的简洁,但不是很具体吗?@djk47463他只需要知道df.shape是什么,然后就可以创建它了
variable value1 value2
0 ex_jim 0.700000 0.300000
1 ex_john 0.500000 0.500000
2 ex_paul 0.533333 0.466667
3 ex_tim 0.766667 0.233333
4 jim 0.400000 0.600000
5 john 1.000000 0.000000
6 paul 0.900000 0.100000
7 tim 0.200000 0.800000
pd.DataFrame(df.iloc[:,1:].values.reshape(8,2),index=['','ex_']*4+df.name.repeat(2),columns=['value1','value2'])
Out[986]:
value1 value2
name
jim 0.400000 0.600000
ex_jim 0.700000 0.300000
tim 0.200000 0.800000
ex_tim 0.766667 0.233333
john 1.000000 0.000000
ex_john 0.500000 0.500000
paul 0.900000 0.100000
ex_paul 0.533333 0.466667