不知道如何在不删除其他列的情况下对一列执行tolist()。
我有3列
category | item | subcategory
Construction | [28, 0, 72168025] | tools
我想打开df.item的包装,以免生病:
category | name | price | view | subcategory
Construction | 28 | 0 | 72168025 | tools
我做到了:
df = pd.DataFrame(df.item.tolist(), columns=['Name', 'Price', 'View'])
但是我得到了
| name | price | view |
| 28 | 0 | 72168025 |
如何将其他列添加到df。
答案 0 :(得分:1)
如果您的列由每一行的列表组成,则不需要.tolist()
将此列转换为单独的列。
这是解决此问题的一种可能方法
生成一些虚拟数据
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10,1), columns=list('A'))
df['category'] = 'Construction'
df['item'] = [[28,0,72168025]]*df.shape[0]
df['subcategory'] = 'tools'
print(df)
A category item subcategory
0 0.972818 Construction [28, 0, 72168025] tools
1 0.583059 Construction [28, 0, 72168025] tools
2 0.784836 Construction [28, 0, 72168025] tools
3 0.393868 Construction [28, 0, 72168025] tools
4 0.806041 Construction [28, 0, 72168025] tools
5 0.871041 Construction [28, 0, 72168025] tools
6 0.573951 Construction [28, 0, 72168025] tools
7 0.513052 Construction [28, 0, 72168025] tools
8 0.982331 Construction [28, 0, 72168025] tools
9 0.713301 Construction [28, 0, 72168025] tools
现在,在apply(pd.Series)
列(per this SO post或this one)上使用item
获得一个单独的数据框,其中每个列表元素都对应一个单独的熊猫系列,并且分配列名
df_split = df['item'].apply(pd.Series)
df_split.columns = ['Name', 'Price', 'View']
最后将原始数据帧与新(拆分)数据帧连接起来
df = pd.concat([df, df_split], axis=1)
输出
print(df)
A category item subcategory Name Price View
0 0.684692 Construction [28, 0, 72168025] tools 28 0 72168025
1 0.404291 Construction [28, 0, 72168025] tools 28 0 72168025
2 0.084463 Construction [28, 0, 72168025] tools 28 0 72168025
3 0.060698 Construction [28, 0, 72168025] tools 28 0 72168025
4 0.096269 Construction [28, 0, 72168025] tools 28 0 72168025
5 0.539278 Construction [28, 0, 72168025] tools 28 0 72168025
6 0.159661 Construction [28, 0, 72168025] tools 28 0 72168025
7 0.651479 Construction [28, 0, 72168025] tools 28 0 72168025
8 0.961392 Construction [28, 0, 72168025] tools 28 0 72168025
9 0.741887 Construction [28, 0, 72168025] tools 28 0 72168025
(可选)删除原始的item
列
df.drop(['item'], axis=1, inplace=True)
print(df)
A category subcategory Name Price View
0 0.833281 Construction tools 28 0 72168025
1 0.229584 Construction tools 28 0 72168025
2 0.403571 Construction tools 28 0 72168025
3 0.822803 Construction tools 28 0 72168025
4 0.968666 Construction tools 28 0 72168025
5 0.053424 Construction tools 28 0 72168025
6 0.759824 Construction tools 28 0 72168025
7 0.766610 Construction tools 28 0 72168025
8 0.752378 Construction tools 28 0 72168025
9 0.056715 Construction tools 28 0 72168025
编辑:尽管这种方法可行,但是比使用apply
更快的方法-请参见here。
答案 1 :(得分:1)
join
+ pop
加入由列表构成的数据框:
df = df.join(pd.DataFrame(df.pop('item').values.tolist()).add_prefix('item'))
# data from @cronoik
data = [('Construction',[28,0,7216825], 'tools')]
labels = ['category', 'item', 'subcategory']
df = pd.DataFrame.from_records(data, columns=labels)
df = df.join(pd.DataFrame(df.pop('item').values.tolist()).add_prefix('item'))
print(df)
category subcategory item0 item1 item2
0 Construction tools 28 0 7216825
答案 2 :(得分:0)
您可以使用原始解决方案,并将结果添加到原始DataFrame中,然后删除原始列:
df2 = pd.DataFrame(df.item.tolist(), columns=['Name', 'Price', 'View'], index=df.index)
final_df = df.join(df2).drop("item", axis=1)
答案 3 :(得分:0)
之所以得到此结果,是因为您从item列中创建了一个新的数据框。您实际要做的是向现有数据框添加新列:
import pandas as pd
data = [('Construction',[28,0,7216825], 'tools')]
labels = ['category', 'item', 'subcategory']
df = pd.DataFrame.from_records(data, columns=labels)
#Adding the new columns based on the split
df[['name','price', 'view']] = pd.DataFrame(df.item.tolist())
#dropping the unneeded item column
df.drop('item', axis=1, inplace=True )