2017-06-22 41 views
0

我有一個數據框df,其中有兩列「值」和「值1」。我想連接這兩列並創建一個新的列「values2」。數值如下:在熊貓中連接兩列的正確方法

values     values1 
[u'12f4',u'ff45']  [u'12f4'] 
         [u'sd45',u'45ty']  
[u'12f34',u'ff2345'] [] 

如果你在第二個單元格中的「值」列是空的。列「values1」中的最後一個單元格是[]。我想,如下串聯 - 我使用

values     values1   values2     
[u'12f4',u'ff45']  [u'12f4']   [u'12f4',u'ff45',u'12f4'] 
         [u'sd45',u'45ty'] [u'sd45',u'45ty'] 
[u'12f34',u'ff2345']  []    [u'12f34',u'ff2345'] 

守則 -

df["values2"] = data["values"] + ', ' + data["values1"] 

這就產生額外的逗號或括號。什麼是這個理想的代碼?

+0

@jezrael你能幫我回答這個問題嗎? – ComplexData

+0

'df ['values2'] = df ['values'] + df ['values1']'有什麼問題? –

+0

@JanTrienes這會給我[u'12f4',u'ff45'] [u'12f4']。相反,我想[u'12f4',u'ff45',u'12f4'] – ComplexData

回答

0

既然你在連接文本,我不認爲有可能利用numpy的ufuncs(我可能是錯的)。

所以,假設我只是使用列表理解。

df["values2"] = [", ".join([str(data.loc[x, "values"]), str(data.loc[x, "values1"])]) for x in df.index] 
+0

這會給我第一排[u'12f4',u'ff45'] [u'12f4']。相反,我想[u'12f4',u'ff45',u'12f4']。此外,請查看空白和[]單元格並處理這種情況。 – ComplexData

0

@piRSquared是正確的(像往常一樣)。如果valuesvalues1是列表,然後...

df = pd.DataFrame({'values': [[u'12f4',u'ff45'], [], [u'12f34',u'ff2345']], 
      'values1': [[u'12f4'], [u'sd45',u'45ty'], []]}, 
      columns=['values', 'values1']) 

可以總結他們這樣......

>>> df[['values', 'values1']].sum(axis=1) 
0 [12f4, ff45, 12f4] 
1   [sd45, 45ty] 
2  [12f34, ff2345] 

由於您使用的代碼是data["values"] + ', ' + data["values1"],它是創造額外的逗號或括號,這聽起來像你的數據不是列表,而是字符串。

df1 = pd.DataFrame({'values': ["[u'12f4',u'ff45']", "''", "[u'12f34',u'ff2345']"], 
      'values1': ["[u'12f4']", "[u'sd45',u'45ty']", '[]']}) 

一百萬種不同的方式來做到這一點。如果你不需要字符串前面的'u',最簡單的方法可能是這樣的:

import ast 
df1[['values', 'values1']].applymap(ast.literal_eval).applymap(lambda x: x if x else []).sum(axis=1) 
+0

您是否可以修改它,使其不影響數據框中的其他列?還有多個其他列,我沒有在我的例子中顯示。我假設你的代碼將適用於整個數據框。 – ComplexData