python - 基于过滤器和多列索引的新列?
问题描述
我一直在尝试搜索/思考一个答案,可能是融化或堆叠,但似乎仍然无法做到。
这是我的 DF :
d = {'type' : [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
'company' : ['A', 'B', 'C', 'D', 'E','A', 'B', 'C', 'D', 'E'],
'value type': ['value car','value car','value car','value car','value car', 'value train','value train','value train','value train','value train',],
'value': [0.1, 0.2, 0.3, 0.4, 0.5, 0.15, 0.25, 0.35, 0.45, 0.55] }
df = pd.DataFrame(d)
这是我想要的(我有左边的数组,我想要右边的): 如您所见,我想要一个基于组合的新列“训练值”(类型,公司)
就像是
for each row :
if (df['value type'] == 'value train'):
#and (type,company) is the same
df['train value'] = df['value']
remove row
例如,类型 1 中的公司 A 将在其火车值的新列中具有新值。有没有办法正确地做到这一点?
编辑::: 有一个很好的答案,但我没有清楚地解释自己。我只想要一个只有“一种值类型”的新列。例如我的新 DF :
d = {'type' : [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
'company' : ['A', 'B', 'C', 'D', 'E','A', 'B', 'C', 'D', 'E'],
'month' : ['jan', 'feb', 'marc', 'apr', 'may', 'jan', 'feb', 'marc', 'apr', 'sep'],
'business' : ['business1', 'business2', 'business3', 'business4', 'business5', 'business6', 'business7', 'business8', 'business9', 'business10'],
'value time': ['past', 'past', 'past', 'past', 'present', 'present', 'present', 'present', 'future', 'future'],
'value': [0.1, 0.2, 0.3, 0.4, 0.11, 0.21, 0.31, 0.41, 0.45, 0.55] }
df = pd.DataFrame(d)
如果可能,只有带有“present”的值才会出现在新列中。就像是
if df['value time'] == 'present' then add to new column
解决方案
您应该旋转您的数据框:
company_to_type = df.set_index('company')['type'].to_dict()
df = df.pivot(index='company', columns='value type', values='value').reset_index()
df['type'] = df.company.map(company_to_type)
df = df.rename_axis(None, axis=1)
df = df[['type', 'company', 'value train', 'value car']]
你会得到
type company value train value car
0 1 A 0.15 0.1
1 2 B 0.25 0.2
2 3 C 0.35 0.3
3 4 D 0.45 0.4
4 5 E 0.55 0.5