2016-11-29 64 views
2

我有一个巨大的文件(20,000行)与2列(id和值)。一些ID有不同的价值。我想写一个for循环来给我所有的id值。python循环连接2列数据

顺便说一下,我使用熊猫和导入数据作为数据框。

例如: 的文件是:

id value 
a 2 
a 3 
b 2 
c 4 
b 5 

我想要的结果是这样的:

a 2,3 
b 2,5 
c 4 

感谢

回答

1

IIUC:
你想要的值列表

df.groupby('id').value.apply(list) 

id 
a [2, 3] 
b [2, 5] 
c  [4] 
Name: value, dtype: object 
如果你想串

...这是@ jezrael的答案,只是修改为我的口味

df.astype(str).groupby('id').value.apply(','.join) 

id 
a 2,3 
b 2,5 
c  4 
Name: value, dtype: object 

实验numpy溶液

u, i = np.unique(df.id.values, return_inverse=True) 
g = np.arange(len(u))[:, None] == i 

def slc(r): 
    return df.value.values[r].tolist() 

pd.Series(list(map(slc, g)), u) 

a [2, 3] 
b [2, 5] 
c  [4] 
dtype: object 

字符串

u, i = np.unique(df.id.values, return_inverse=True) 
g = np.arange(len(u))[:, None] == i 

def slc(r): 
    return ','.join(map(str, df.value.values[r].tolist())) 

pd.Series(list(map(slc, g)), u) 

a 2,3 
b 2,5 
c  4 
dtype: object 

定时

np.random.seed(123) 
N = 1000000 
L = list("ABCDEFGHIJKLMNO") 
df = pd.DataFrame({'id':np.random.choice(L, N), 
        'value': np.random.randint(10, size=N)}) 

代码

def pir1(df): 
    return df.astype(str).groupby('id').value.apply(','.join) 

def pir2(df): 
    u, i = np.unique(df.id.values, return_inverse=True) 
    g = np.arange(len(u))[:, None] == i 

    def slc(r): 
     return ','.join(map(str, df.value.values[r].tolist())) 

    return pd.Series(list(map(slc, g)), u, name='value') 

def pir3(df): 
    return df.groupby('id').value.apply(list) 

def pir4(df): 
    u, i = np.unique(df.id.values, return_inverse=True) 
    g = np.arange(len(u))[:, None] == i 

    def slc(r): 
     return df.value.values[r].tolist() 

    return pd.Series(list(map(slc, g)), u, name='value') 

def jez1(df): 
    return df.groupby('id')['value'].apply(lambda x: ','.join(x.astype(str))) 

结果
注:pir1pir2是字符串的结果。 pir3pir4是列表结果。

enter image description here

2

使用groupbyapplyjoin。显然,如果数字列value是必要的强制转换为string

print (df.groupby('id')['value'].apply(lambda x: ','.join(x.astype(str))).reset_index()) 
    id value 
0 a 2,3 
1 b 2,5 
2 c  4 

时序

np.random.seed(123) 
N = 1000000 
L = list("ABCDEFGHIJKLMNO") 
df = pd.DataFrame({'id':np.random.choice(L, N), 
        'value': np.random.randint(10, size=N)}) 
#[1000000 rows x 2 columns]     
print (df) 

In [84]: %timeit (df.groupby('id')['value'].apply(lambda x: ','.join(x.astype(str))).reset_index()) 
1 loop, best of 3: 1.46 s per loop 

In [85]: %timeit (df.astype(str).groupby('id').value.apply(','.join).reset_index()) 
1 loop, best of 3: 1.83 s per loop 
+0

如果需要更快的解决方案,需要带连接的lambda。请参阅我的答案的更新。 – jezrael