Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将dataframe单元格中的关键字转换为各自的列_Python_Pandas - Fatal编程技术网

Python 如何将dataframe单元格中的关键字转换为各自的列

Python 如何将dataframe单元格中的关键字转换为各自的列,python,pandas,Python,Pandas,我有一个如下所示的数据帧: In[8]: df = pd.DataFrame({'transport': ['Car;Bike;Horse','Car','Car;Bike', 'Horse;Car']}) df Out[8]: transport 0 Car;Bike;Horse 1 Car 2 Car;Bike 3 Horse;Car 我想把它转换成这样的东西: In[9]: df2 = pd.DataFrame({'transport_car': [True,Tr

我有一个如下所示的数据帧:

In[8]: df = pd.DataFrame({'transport': ['Car;Bike;Horse','Car','Car;Bike', 'Horse;Car']})
df
Out[8]:
    transport
 0  Car;Bike;Horse
 1  Car
 2  Car;Bike
 3  Horse;Car
我想把它转换成这样的东西:

In[9]: df2 = pd.DataFrame({'transport_car': [True,True,True,True],'transport_bike': [True,False,True,False], 'transport_horse': [True,False,False,True]} )
df2
Out[10]:
  transport_bike    transport_car   transport_horse
0   True                True            True
1   False               True            False
2   True                True            False
3   False               True            True
我得到了一个解决方案,但它感觉非常“黑客”和“不和谐”。(它适用于我相当小的数据集)

我的目标是使用第二种表示法进行一些评估,以回答诸如“汽车多久使用一次?”、“汽车和马多久一起使用一次”等问题

答案建议使用
pivot
eval
可能是一种方法,但我不确定


那么,将数据帧从第一种表示形式转换为第二种表示形式的最佳方式是什么呢

您可以使用
apply
为每个条目构造一个序列,并将拆分的字段作为索引。这将产生一个以索引作为列的数据帧:

df.transport.apply(lambda x: pd.Series(True, x.split(";"))).fillna(False)

我决定用一个工作示例进行扩展:

In [249]: %paste
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(min_df=1)
X = vectorizer.fit_transform(df.transport.str.replace(';',' '))

r = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
## -- End pasted text --

In [250]: r
Out[250]:
   bike  car  horse
0     1    1      1
1     0    1      0
2     1    1      0
3     0    1      1
现在,您可以将其连接回源DF:

In [251]: df.join(r)
Out[251]:
        transport  bike  car  horse
0  Car;Bike;Horse     1    1      1
1             Car     0    1      0
2        Car;Bike     1    1      0
3       Horse;Car     0    1      1
计时:对于40K行DF:

In [254]: df = pd.concat([df] * 10**4, ignore_index=True)

In [255]: df.shape
Out[255]: (40000, 1)

In [256]: %timeit df.transport.apply(lambda x: pd.Series(True, x.split(";"))).fillna(False)
1 loop, best of 3: 33.8 s per loop

In [257]: %%timeit
     ...: vectorizer = CountVectorizer(min_df=1)
     ...: X = vectorizer.fit_transform(df.transport.str.replace(';',' '))
     ...: r = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
     ...:
1 loop, best of 3: 732 ms per loop

我会考虑使用ScKIT学习提供的。矢量器将构造一个向量,其中每个索引引用一个项,值引用该项在记录中的出现次数


与其他答案中建议的国产方法相比,其优势在于大型数据集的效率和通用性。显然,缺点是带来了额外的依赖性

非常干净的方法@大都会,谢谢!我添加了计时-
CountVectorizer
太棒了!我应该早就学会了…非常好的答案。最后,我使用了Psidorn的答案和Ted Petrou的扩展名。
In [254]: df = pd.concat([df] * 10**4, ignore_index=True)

In [255]: df.shape
Out[255]: (40000, 1)

In [256]: %timeit df.transport.apply(lambda x: pd.Series(True, x.split(";"))).fillna(False)
1 loop, best of 3: 33.8 s per loop

In [257]: %%timeit
     ...: vectorizer = CountVectorizer(min_df=1)
     ...: X = vectorizer.fit_transform(df.transport.str.replace(';',' '))
     ...: r = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
     ...:
1 loop, best of 3: 732 ms per loop