[英]Tuple elements to dataframe column in python
我有包含 0-3 組對的 2D 列表(數據將始終配對)。
例子:
[[2.0, 0.1], [7.0, 0.6], [1.0, 0.3]] or
[[9.0, 0.7], [1.0, 0.2]] or
[[]]
我希望能夠將每對元素的每個元素附加到現有數據框中自己的列中。
使用上述數據的所需數據幀:
other_data, pair_0_0, pair_0_1, pair_1_0, pair_1_1, pair_2_0, pair2_1
'blah', 2.0, 0.1, 7.0, 0.6, 1.0, 0.3
'blah blah', 9.0, 0.7, 1.0, 0.2
'blaah'
它需要能夠處理空值,並保持列表的順序。
我已經嘗試了以下方法,但是如果我沒有 3 對,它就不會給出索引錯誤。
df.loc[len(df)] = ['blah blah', list2D[0][0], list2D[0][1], list2D[1][0], list2D[1][1], list2D[2][0], list2D[2][1]
我認為這會涉及一些列表理解,但我不知道該怎么做。
列表numpy.ravel
中的numpy.ravel
怎么樣:
l1 = [[2.0, 0.1], [7.0, 0.6], [1.0, 0.3]]
l2 = [[9.0, 0.7], [1.0, 0.2]]
l3 = [[]]
df = pd.DataFrame([np.ravel(x) for x in [l1, l2, l3]])
# Fix column headers
df.columns = [f'pair_{x//2}_{x%2}' for x in range(df.shape[1])]
[出去]
pair_0_0 pair_0_1 pair_1_0 pair_1_1 pair_2_0 pair_2_1
0 2.0 0.1 7.0 0.6 1.0 0.3
1 9.0 0.7 1.0 0.2 NaN NaN
2 NaN NaN NaN NaN NaN NaN
例如,要將單個列表append
到現有DataFrame
,請使用:
l4 = [[3.0, 0.2], [6.0, 0.8], [1.2, 0.6]]
df.append(pd.DataFrame([np.ravel(l4)]).rename(columns=lambda x: f'pair_{x//2}_{x%2}'))
[出去]
pair_0_0 pair_0_1 pair_1_0 pair_1_1 pair_2_0 pair_2_1
0 2.0 0.1 7.0 0.6 1.0 0.3
1 9.0 0.7 1.0 0.2 NaN NaN
2 NaN NaN NaN NaN NaN NaN
0 3.0 0.2 6.0 0.8 1.2 0.6
或者在循環中使用pandas.concat
從頭開始創建DataFrame
你可以這樣做:
df = pd.DataFrame()
for l in [l1, l2, l3]:
df = pd.concat([df, pd.DataFrame([np.ravel(l)]).rename(columns=lambda x: f'pair_{x//2}_{x%2}')],
sort=True)
另一種非常簡單的方法是使用 Python dict comprehension 插入一個新條目 e:
row = {f'pair_{j}_{i}': e[j][i] for j in range(len(e)) for i in range(len(e[j]))}
例子:
e1 = [[2.0, 0.1], [7.0, 0.6], [1.0, 0.3]]
e2 = [[9.0, 0.7], [1.0, 0.2]]
e3 = [[]]
df = pd.DataFrame({})
for e in [e1, e2, e3]:
row = {f'pair_{j}_{i}': e[j][i] for j in range(len(e)) for i in range(len(e[j]))}
df = df.append(row, ignore_index=True)
打印(df)
pair_0_0 pair_0_1 pair_1_0 pair_1_1 pair_2_0 pair_2_1
0 2.0 0.1 7.0 0.6 1.0 0.3
1 9.0 0.7 1.0 0.2 NaN NaN
2 NaN NaN NaN NaN NaN NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.