Python 将Dataframe列中的列表拆分为特定的列名

Python 将Dataframe列中的列表拆分为特定的列名,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个关于将dataframe列中的列表拆分为多个列的问题。但拆分的每个值都需要放在特定的列中 假设我有这个数据帧: date data 2020-01-01 00:00:00 [G07, G08, G10, G16] 2020-01-01 00:00:01 [G07, G08, G16] 2020-01-01 00:00:02 [G08, G10, G16, G20, G21] 2020-01-01 00:00:03 [G16, G

我有一个关于将dataframe列中的列表拆分为多个列的问题。但拆分的每个值都需要放在特定的列中

假设我有这个数据帧:

date                   data
2020-01-01 00:00:00    [G07, G08, G10, G16]
2020-01-01 00:00:01    [G07, G08, G16]
2020-01-01 00:00:02    [G08, G10, G16, G20, G21]
2020-01-01 00:00:03    [G16, G20, G21, G26, G27, R02]
2020-01-01 00:00:04    [G07, G08, G26, G27]
我在寻找这样的结果:

date                   G07  G08  G10  G16  G20  G21  G26  G27  R02
2020-01-01 00:00:00    G07  G08  G10  G16  NaN  NaN  NaN  NaN  NaN
2020-01-01 00:00:01    G07  G08  NaN  G16  NaN  NaN  NaN  NaN  NaN
2020-01-01 00:00:02    NaN  G08  G10  G16  G20  G21  NaN  NaN  NaN
2020-01-01 00:00:03    NaN  NaN  NaN  G16  G20  G21  G26  G27  R02
2020-01-01 00:00:04    G07  G08  NaN  NaN  NaN  NaN  G26  G27  NaN
要最终得到这种矩阵:

date                   G07  G08  G10  G16  G20  G21  G26  G27  R02
2020-01-01 00:00:00    1    1    1    1    0    0    0    0    0
2020-01-01 00:00:01    1    1    0    1    0    0    0    0    0    
2020-01-01 00:00:02    0    1    1    1    1    1    0    0    0    
2020-01-01 00:00:03    0    0    0    1    1    1    1    1    1    
2020-01-01 00:00:04    1    1    0    0    0    0    1    1    0    
通过执行此类型的命令:

In [1] pd.DataFrame(self.df['data'].to_list())

Out [1] date                   1    2    3    4    5    6    
        2020-01-01 00:00:00    G07  G08  G10  G16
        2020-01-01 00:00:01    G07  G08  G16
        2020-01-01 00:00:02    G08  G10  G16  G20  G21
        2020-01-01 00:00:03    G16  G20  G21  G26  G27  R02
        2020-01-01 00:00:04    G07  G08  G26  G27
我只能将列表拆分为其他列。但我无法找到将每个值放入特定列的方法

我一直在考虑对每个日期的每个值进行循环,但速度非常慢,而且我有超过1000000行的数据集。

请尝试通过
join()
strip()
get\u dummies()
drop()
方法:

out=df.join(df['data'].astype(str).str.strip('[]').str.get_dummies(',')).drop('data',1)
输出的输出

另一种方法:

x=(
pd.DataFrame([{k:1表示v中的k}v表示df中的v[“数据”])
.替换(np.nan,0)
.astype(int)
)
打印(局部浓度([df[“日期”],x],轴=1))
印刷品:

日期G07 G08 G10 G16 G20 G21 G26 G26 G27 G26 G27 R02
0  2020-01-01 00:00:00    1    1    1    1    0    0    0    0    0
1  2020-01-01 00:00:01    1    1    0    1    0    0    0    0    0
2  2020-01-01 00:00:02    0    1    1    1    1    1    0    0    0
3  2020-01-01 00:00:03    0    0    0    1    1    1    1    1    1
4  2020-01-01 00:00:04    1    1    0    0    0    0    1    1    0

sklearn

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()

s = pd.DataFrame(mlb.fit_transform(df['data']),columns=mlb.classes_, index=df.index)

df = df.join(s)

再添加一个方法:

k = df.explode('data').assign(temp = 1)
df = k.pivot(*k).fillna(0)
进一步改造(如需要):

输出:

                  date  G07  G08  G10  G16  G20  G21  G26  G27  R02
0  2020-01-01 00:00:00    1    1    1    1    0    0    0    0    0
1  2020-01-01 00:00:01    1    1    0    1    0    0    0    0    0
2  2020-01-01 00:00:02    0    1    1    1    1    1    0    0    0
3  2020-01-01 00:00:03    0    0    0    1    1    1    1    1    1
4  2020-01-01 00:00:04    1    1    0    0    0    0    1    1    0
用熊猫做什么

(dataf
.爆炸(“数据”)
.pivot(index=“date”、columns=“data”、values=“data”)
.notna()
.astype(int))
我们得到所需的输出格式:

data                  G08   G1   G10   G16   G2  ...   G27   R0  G07  G08  G16
date                                             ...                          
2020-01-01 00:00:00     1    1     1     0    0  ...     0    0    1    0    0
2020-01-01 00:00:01     1    1     0     0    0  ...     0    0    1    0    0
2020-01-01 00:00:02     0    0     1     1    1  ...     0    0    0    1    0
2020-01-01 00:00:03     0    0     0     0    0  ...     1    1    0    0    1
2020-01-01 00:00:04     1    0     0     0    1  ...     0    0    1    0    0
我们分解
数据
列,以
日期
作为索引,以
数据
作为列值来透视表。然后,从检查
na
中使用get
True
False
,并转换为
int
;)

数据和代码

输入io
作为pd进口熊猫
数据=io.StringIO(“”)
日期|数据
2020-01-01 00:00:00 |[G07、G08、G10、G16]
2020-01-01 00:00:01 |[G07、G08、G16]
2020-01-01 00:00:02 |[G08、G10、G16、G20、G21]
2020-01-01 00:00:03 |[G16、G20、G21、G26、G27、R02]
2020-01-01 00:00:04 |[G07、G08、G26、G27]
""")
dataf=pd.read_csv(data,sep=“|”,parse_dates=[“date”],converters={“data”:lambda x:x[1:-2]。拆分(“,”})

我建议使用较大的数据帧。非常感谢您的快速响应。但在输出端,G08和G16列似乎是重复的。您看到了吗?
data                  G08   G1   G10   G16   G2  ...   G27   R0  G07  G08  G16
date                                             ...                          
2020-01-01 00:00:00     1    1     1     0    0  ...     0    0    1    0    0
2020-01-01 00:00:01     1    1     0     0    0  ...     0    0    1    0    0
2020-01-01 00:00:02     0    0     1     1    1  ...     0    0    0    1    0
2020-01-01 00:00:03     0    0     0     0    0  ...     1    1    0    0    1
2020-01-01 00:00:04     1    0     0     0    1  ...     0    0    1    0    0