首页 > 解决方案 > 元组元素到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]

我认为这将涉及一些列表理解,但我不知道该怎么做。

标签: pythonpandasdataframelist-comprehension

解决方案


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)

推荐阅读