将列表与数据帧相结合,并将多值单元格扩展到列中



假设我有以下输入:

table = pd.DataFrame({'a':[0,0,0,0],'b':[1,1,1,3,],'c':[2,2,5,4],'d':[3,6,6,6]},dtype='float64')
list = [[55,66],
[77]]
#output of the table
a    b    c    d
0  0.0  1.0  2.0  3.0
1  0.0  1.0  2.0  6.0
2  0.0  1.0  5.0  6.0
3  0.0  3.0  4.0  6.0

我想把listtable结合起来,所以最终的形状应该是:

a    b    c    d  ID_0   ID_1
0  0.0  1.0  2.0  3.0  55.0   66.0
1  0.0  1.0  2.0  6.0  77.0    NaN
2  0.0  1.0  5.0  6.0   NaN    NaN
3  0.0  3.0  4.0  6.0   NaN    NaN

我找到了一种方法,但它看起来有点长,可能是一种更短的方法。

步骤1:

x = pd.Series(list, name ="ID")
new = pd.concat([table, x], axis=1)
# output
a    b    c    d      ID
0  0.0  1.0  2.0  3.0  [5, 6]
1  0.0  1.0  2.0  6.0    [77]
2  0.0  1.0  5.0  6.0     NaN
3  0.0  3.0  4.0  6.0     NaN

步骤2:

ID = new['ID'].apply(pd.Series)
ID = ID.rename(columns = lambda x : 'ID_' + str(x))
new_x = pd.concat([new[:], ID[:]], axis=1)
# output
a    b    c    d      ID  ID_0  ID_1
0  0.0  1.0  2.0  3.0  [5, 6]   5.0   6.0
1  0.0  1.0  2.0  6.0    [77]  77.0   NaN
2  0.0  1.0  5.0  6.0     NaN   NaN   NaN
3  0.0  3.0  4.0  6.0     NaN   NaN   NaN

步骤3:

new_x = new_x.drop(columns=['ID'], axis = 1)

有什么更短的方法可以达到同样的结果吗?

假设table上有一个默认索引(如问题所示(,我们可以简单地创建一个DataFrame(从_records或使用构造函数(,然后连接回table,并允许索引对齐。(add_prefix是将"ID_"前缀添加到默认数字列的简单方法(

new_df = table.join(
pd.DataFrame.from_records(lst).add_prefix('ID_')
)

new_df:

a    b    c    d  ID_0  ID_1
0  0.0  1.0  2.0  3.0  55.0  66.0
1  0.0  1.0  2.0  6.0  77.0   NaN
2  0.0  1.0  5.0  6.0   NaN   NaN
3  0.0  3.0  4.0  6.0   NaN   NaN

使用2个数据帧通常比使用数据帧和列表更容易。以下是from_records对lst:的作用

pd.DataFrame.from_records(lst)
0     1
0  55  66.0
1  77   NaN

索引(行(0和1现在将与table中的相应索引值对齐(分别为0和1(。

add_prefix在加入之前修复列名:

pd.DataFrame.from_records(lst).add_prefix('ID_')
ID_0  ID_1
0    55  66.0
1    77   NaN

设置和导入:

import pandas as pd  # v1.4.4
table = pd.DataFrame({
'a': [0, 0, 0, 0],
'b': [1, 1, 1, 3, ],
'c': [2, 2, 5, 4],
'd': [3, 6, 6, 6]
}, dtype='float64')
lst = [[55, 66],
[77]]

相关内容

最新更新