在非独特的Pandas DataFrame列上高效运行操作

时间:2017-06-19 15:52:55

标签: python python-2.7 pandas

我有一个类似于此的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不是唯一的,有没有更好的方法呢?也许存储每个唯一标识符的计算,然后传递结果?计算非常复杂并且添加了行数,这需要很长时间。但我想减少它,因为标识符不是唯一的。

有什么想法吗?

1 个答案:

答案 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,因为它是一个字符串,结果是10101111等。到目前为止,我喜欢这些代码,但接下来,我使用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。我可能错过了一些东西。