我有一个df
具有列的数据框['metric_type', 'metric_value']
。对于每一行,我想确保我有一列名称等于,'metric_type'
并且该列的值等于'metric_value'
。
我的问题之一是'metric_type'
我想摆脱虚假的空间。
考虑数据框df
:
df = pd.DataFrame([
['a ', 1],
[' b', 2],
[' c ', 3]
], columns=['metric_type', 'metric_value'])
print(df)
metric_type metric_value
0 a 1
1 b 2
2 c 3
请注意,每个的值'metric_type'
在不同的位置都有空格。
我创建了一个要使用的函数,apply
但是要花很长时间。
def assign_metric_vals(row):
row[row['metric_type'].replace(" ", "")] = row['metric_value']
return row
使用它时,我得到以下信息:
a b c metric_type metric_value
0 1.0000 nan nan a 1
1 nan 2.00 nan b 2
2 nan nan 3.00 c 3
有没有更好的方法(读为“更快”)来完成同一任务?
将索引设置为metric_type
并进行堆叠会更好。
df.set_index(df.metric_type.str.replace(' ', ''), append=True).metric_value.unstack()
示范
df = pd.DataFrame([
['a ', 1],
[' b', 2],
[' c ', 3]
], columns=['metric_type', 'metric_value'])
print(df)
metric_type metric_value
0 a 1
1 b 2
2 c 3
print(df.apply(assign_metric_vals, 1))
a b c metric_type metric_value
0 1.0000 nan nan a 1
1 nan 2.00 nan b 2
2 nan nan 3.00 c 3
或我的方式
idx = df.metric_type.str.replace(' ', '')
d1 = df.set_index(idx, append=True).metric_value.unstack()
print(pd.concat([d1, df], axis=1))
a b c metric_type metric_value
0 1.0000 nan nan a 1
1 nan 2.00 nan b 2
2 nan nan 3.00 c 3
定时
使用更大的 df
df1 = pd.concat([df] * 30000, ignore_index=True)
%%timeit
idx = df1.metric_type.str.replace(' ', '')
d1 = df1.set_index(idx, append=True).metric_value.unstack()
pd.concat([d1, df1], axis=1)
10个循环,最佳3:每个循环77.3毫秒
%%timeit
df1.apply(assign_metric_vals, 1)
1次循环,每循环3:57.4 s最佳
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句