2017-07-26 60 views
1

我有一個熊貓數據幀,如:轉換包含在大熊貓數據幀字典的多個列的列表中列

pd.DataFrame({'a':[1,2], 'b':[[{'c':1,'d':5},{'c':3, 'd':7}],[{'c':10,'d':50}]]}) 
Out[2]: 
    a           b 
0 1 [{u'c': 1, u'd': 5}, {u'c': 3, u'd': 7}] 
1 2     [{u'c': 10, u'd': 50}] 

而且我想,如果有擴大「B」柱,並重復「A」柱超過在「b」一個元素如下:

Out[2]: 
    a c d 
0 1 1 5 
1 1 3 7 
2 2 10 50 

我試圖用每行適用的功能,但我沒有成功,顯然將一個行轉換爲一行。

回答

1

您可以使用concatlist comprehension

df = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df['a']) 
     .reset_index(level=1, drop=True).reset_index() 

print (df) 
    a c d 
0 1 1 5 
1 1 3 7 
2 2 10 50 

編輯:

如果指數是唯一的,則是對所有列可能使用join

df1 = pd.concat([pd.DataFrame(x) for x in df['b']], keys=df.index) 
     .reset_index(level=1,drop=True) 
df = df.drop('b', axis=1).join(df1).reset_index(drop=True) 
print (df) 
    a c d 
0 1 1 5 
1 1 3 7 
2 2 10 50 

我儘量簡化的解決方案:

l = df['b'].str.len() 
df1 = pd.DataFrame(np.concatenate(df['b']).tolist(), index=np.repeat(df.index, l)) 
df = df.drop('b', axis=1).join(df1).reset_index(drop=True) 
print (df) 
    a c d 
0 1 1 5 
1 1 3 7 
2 2 10 50 
+0

在我真正的問題'一個'不是一個單一的列。在這種情況下我可以使用這種方法嗎?我有幾個專欄,我想重複。@ jezrael –