【问题标题】:Splitting one column into multiple columns with python pandas使用 python pandas 将一列拆分为多列
【发布时间】:2015-09-27 21:37:34
【问题描述】:

我想在我的数据框中将一列拆分为多列。用逗号分隔。

我想在 excel 中应用“文本到列”功能。

拆分列后,我将给出自己的标题。 “旋转门”是我的专栏的名称。我有:

(A006, R079, 00-00-04, 5 AVE-59 ST)

每行中的数据类型。最后我想拥有:

A006    R079   00-00-04   5 AVE-59 ST

带有我将创建的标题。

我最后尝试了:

df.Turnstile.str.split().tolist()

但我只有'nan'

当我检查“旋转门”列的类型时,它显示“对象”。我试图将该系列转换为字符串:

df['Turnstile'] = df[['Turnstile'].astype(str)]

但它给了我:

AttributeError: 'list' object has no attribute 'astype'

请指教。

谢谢。

【问题讨论】:

  • 当你type(df.Turnstile.values[0])时你会得到什么?
  • 它说的是元组。 @maxymoo
  • 你能检查每个元组条目的 dtype 吗?即[type(df.Turnstile.values[0][i]) for i in range(4)
  • 它说它是字符串: @maxymoo
  • 你能把df.head()的结果贴出来吗?

标签: python pandas split


【解决方案1】:

也许另一种看待这个问题的方法是将一列元组转换为DataFrame,如下所示:

In [10]: DataFrame(df['Turnstile'].tolist())
Out[10]:
      0     1         2            3
0  A006  R079  00-00-04  5 AVE-59 ST
1  A006  R079  00-00-04  5 AVE-59 ST
2  A006  R079  00-00-04  5 AVE-59 ST
3  A006  R079  00-00-04  5 AVE-59 ST
4  A006  R079  00-00-04  5 AVE-59 ST
5  A006  R079  00-00-04  5 AVE-59 ST
6  A006  R079  00-00-04  5 AVE-59 ST
7  A006  R079  00-00-04  5 AVE-59 ST
8  A006  R079  00-00-04  5 AVE-59 ST
9  A006  R079  00-00-04  5 AVE-59 ST

如果是这种情况,下面是一个将元组列转换为 DataFrame 并将其添加回原始数据帧的示例:

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

# create a fake dataframe, repeating the tuple given in the example
In [2]: df = DataFrame(data={'Observations': np.random.randn(10) * np.arange(10),
...:     'Turnstile': (('A006', 'R079', '00-00-04', '5 AVE-59 ST'),)*10})

In [3]: df.head()
Out[3]:
   Observations                            Turnstile
0     -0.000000  (A006, R079, 00-00-04, 5 AVE-59 ST)
1     -0.022668  (A006, R079, 00-00-04, 5 AVE-59 ST)
2     -2.380515  (A006, R079, 00-00-04, 5 AVE-59 ST)
3     -4.209983  (A006, R079, 00-00-04, 5 AVE-59 ST)
4      3.932902  (A006, R079, 00-00-04, 5 AVE-59 ST)

# all at once turn the column of tuples into a dataframe and concat that with the original df
In [4]: df = pd.concat([df,DataFrame(df['Turnstile'].tolist())], axis=1, join='outer')

In [5]: df.head()
Out[5]:
       Observations                            Turnstile     0     1         2  \
    0     -0.000000  (A006, R079, 00-00-04, 5 AVE-59 ST)  A006  R079  00-00-04
    1     -0.022668  (A006, R079, 00-00-04, 5 AVE-59 ST)  A006  R079  00-00-04
    2     -2.380515  (A006, R079, 00-00-04, 5 AVE-59 ST)  A006  R079  00-00-04
    3     -4.209983  (A006, R079, 00-00-04, 5 AVE-59 ST)  A006  R079  00-00-04
    4      3.932902  (A006, R079, 00-00-04, 5 AVE-59 ST)  A006  R079  00-00-04

         3
0  5 AVE-59 ST
1  5 AVE-59 ST
2  5 AVE-59 ST
3  5 AVE-59 ST
4  5 AVE-59 ST

# i assume you don't need this column anymore
In [6]: del df['Turnstile']

如果可行,您当然可以根据需要命名新列。

【讨论】:

  • 谢谢@measureallthethings
  • @measureallthethings 这是一个比我更好的答案;我没有意识到您可以从元组列表中创建数据框
【解决方案2】:

这里有几个选项,如果你的数据是真正的 csv 格式,比如从 Excel 导出,你可以使用pandas.read_csv 读取文件,它会根据列分隔符自动拆分为列。

如果您的数据是带有逗号的字符串列,您可以使用str.split 重新定义您的列,但据我所知,您需要将结果列转储为原始 Python 列表,然后重新转换为数据框:

import pandas as pd
df = pd.DataFrame([["A006, R079, 00-00-04, 5 AVE-59 ST"]])
df2 = pd.DataFrame(df[0].str.split(',').tolist())

【讨论】:

  • 它给了我 KeyError。不工作。 @maxymoo 正如我所提到的,我放了---> df.Turnstile.str.split().tolist() 它给了我所有的'nan'
【解决方案3】:

试试df.Turnstile.str.split(',')

【讨论】:

  • 回答问题时,请提供与您的代码相关的解释。有些人可能不理解您的代码或看不到它如何回答问题。见how to write a good answer
猜你喜欢
  • 2020-02-10
  • 2016-11-17
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多