Python 将Dataframe列中的列表拆分为特定的列名
我有一个关于将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
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
中使用getTrue
或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