我有一个类似于此的DataFrame:
import numpy as np
raw_data = {'Identifier':['10','10','10','11',11,'12','13']}
import pandas as pd
df = pd.DataFrame(raw_data,columns=['Identifier'])
print df
正如您所见,标识符' column不是唯一的,dataframe本身有很多行。
每次我尝试使用以下方法对Identifier列进行计算:
df['CalculatedColumn'] = df['Identifer'] + apply calculation here
由于Identifer不是唯一的,有没有更好的方法呢?也许存储每个唯一标识符的计算,然后传递结果?计算非常复杂并且添加了行数,这需要很长时间。但我想减少它,因为标识符不是唯一的。
有什么想法吗?
答案 0 :(得分:0)
我很确定有更多的pythonic方式,但这对我有用:
import numpy as np
import pandas as pd
raw_data = {'Identifier':['10','10','10','11','11','12','13']}
df = pd.DataFrame(raw_data,columns=['Identifier'])
df['CalculatedColumn']=0
dfuni=df.drop_duplicates(['Identifier'])
dfuni['CalculatedColumn']=dfuni['Identifier']*2 # perform calculation
for j in range(len(dfuni)):
df['CalculatedColumn'][df['Identifier']==dfuni['Identifier'].iloc[j]]=dfuni['CalculatedColumn'].iloc[j]
print df
print dfuni
作为解释:我创建了一个新的数据框dfuni
,其中包含原始数据框的所有唯一字段。然后,你对此进行计算(我只是将Identifier
的值乘以2,因为它是一个字符串,结果是1010
,1111
等。到目前为止,我喜欢这些代码,但接下来,我使用dfuni
的所有值循环将它们复制回原始df
。对于这一点,可能会有一个更优雅的解决方案。
结果,我得到了:
Identifier CalculatedColumn
0 10 1010
1 10 1010
2 10 1010
3 11 1111
4 11 1111
5 12 1212
6 13 1313
PS:这段代码是用Python 3测试的。我唯一适应的是print-statements。我可能错过了一些东西。