python-如何在不删除其他列的情况下在一个列上执行tolist(),python pandas

时间:2019-01-27 19:55:37

标签: python pandas

不知道如何在不删除其他列的情况下对一列执行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。

4 个答案:

答案 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 postthis 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 )