2016-11-29 59 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