2015-10-22 53 views
4

我有一個DataFrame多行。有什麼方法可以將它們組合起來形成一個字符串?如何將多行字符串合併爲一個使用熊貓?

例如:

 words 
0 I, will, hereby 
1 am, gonna 
2 going, far 
3 to 
4 do 
5 this 

預期輸出:

I, will, hereby, am, gonna, going, far, to, do, this 
+0

什麼是元素的類型?我猜'0','1'等是索引權? –

+0

索引就像0,1,2,3,4,5,6,7,.... – eclairs

回答

10

您可以使用str.cat加入每一行中的字符串。對於一個系列或列s,寫:

>>> s.str.cat(sep=', ') 
'I, will, hereby, am, gonna, going, far, to, do, this' 
+0

我試着上面提到的代碼。它給了我一個錯誤:AttributeError:'DataFrame'對象沒有'str'屬性。這是因爲數據框中還有空白行嗎?如果是這樣,我該如何糾正它? – eclairs

+1

'.str'訪問器僅適用於DataFrame的一個Series或一列(而不是整個DataFrame)。如果您想將此方法應用於DataFrame的多列,則需要依次在每列上分別使用它。 –

+0

謝謝,你能幫我解決上述問題嗎?如果我想連接數據幀df的列'單詞'的行,我該如何寫它?謝謝你的幫助! – eclairs

3

如果你有一個數據幀,但不是一個系列,並且希望貓值(我認爲文本值只)的基礎上的另一列從不同行的「按'鍵分組。您可以使用類DataFrameGroupBy中的.agg方法。這裏是一個link to the API manual 這裏是大熊貓v0.18.1

import pandas as pd 
df = pd.DataFrame({ 
    'category':['A'] * 3 + ['B'] * 2 
    ,'name':['A1','A2','A3','B1','B2'] 
    ,'num':range(1,6) 
}) 
df.groupby('category').agg({'name':lambda x:', '.join(x) 
         ,'num':lambda x:x.max() 
         }) 
+0

次要評論:需要分配給一個新的數據幀egdf2 = df.groupby(...) –

2

如何傳統的Python的join測試示例代碼?而且,速度更快。

In [209]: ', '.join(df.words) 
Out[209]: 'I, will, hereby, am, gonna, going, far, to, do, this' 

計時12月年,2016年對大熊貓0.18.1

In [214]: df.shape 
Out[214]: (6, 1) 

In [215]: %timeit df.words.str.cat(sep=', ') 
10000 loops, best of 3: 72.2 µs per loop 

In [216]: %timeit ', '.join(df.words) 
100000 loops, best of 3: 14 µs per loop 

In [217]: df = pd.concat([df]*10000, ignore_index=True) 

In [218]: df.shape 
Out[218]: (60000, 1) 

In [219]: %timeit df.words.str.cat(sep=', ') 
100 loops, best of 3: 5.2 ms per loop 

In [220]: %timeit ', '.join(df.words) 
100 loops, best of 3: 1.91 ms per loop 
+1

有趣的時機,我得到了0.19.2類似的結果。然而,我認爲這裏的權衡是'str.cat'將無縫地處理像'NaN'和'None'這樣的缺失值(甚至可以提供'na_rep'參數來選擇如何表示這些缺失值)。 Python的'join'在這裏失敗。你可以通過過濾/填入缺失值和*然後*加入來解決這個問題,但是這會讓它慢下來。如果列中存有分類值,那麼填充這樣的缺失值也會失敗; 'str.cat'正常工作。 –