【问题标题】:How to split a column data into other columns which is stored in a dataframe?如何将列数据拆分为存储在数据框中的其他列?
【发布时间】:2016-10-17 21:19:23
【问题描述】:

df 是包含以下信息的数据框。

 In [61]: df.head()
    Out[61]: 
       id  movie_id                  info
    0   1         1   Italy:1 January 1994
    1   2         2   USA:22 January 2006
    2   3         3   USA:12 February 2006
    3   4         4   USA:February 2006
    4   5         5   USA:2006

我想要如下输出:

In [61]: df.head()    
Out[61]: 
   id  movie_id    country Date    Month   Year
0   1         1    Italy    1     January  1994
1   2         2    USA      22    January  2006
2   3         3    USA      12    February 2006
3   4         4    USA      None  February 2006
4   5         5    USA      None  None     2006

数据存储在dataframe中,必须覆盖到dataframe中。

【问题讨论】:

  • 向我们展示您的尝试
  • 编写一个函数,将提取/分离并返回片段,然后将该函数的返回值分配给一个新列 - 可能使用Dataframe.apply or .applymap

标签: python pandas


【解决方案1】:

您可以使用正则表达式:|\s+ 以分号或空格分隔列,并将expand 参数指定为true,以便结果将扩展为列:

df[["country","Date","Month","Year"]] = df['info'].str.split(':|\s+', expand = True)

更新

要处理可选的缺失日期和月份,您可以尝试使用正则表达式 extract

(df[["country","Date","Month","Year"]] = 
     df['info'].str.extract('^([A-Za-z]+):(\d{1,2})? ?([A-Za-z]+)? ?(\d{4})$'))
  • ^([A-Za-z]+):(\d{1,2})? ?([A-Za-z]+)? ?(\d{4})$'包含四个捕获组,分别对应country, Date, Month, Year
  • ^$ 表示字符串的开始和结束;
  • ([A-Za-z]+) 捕获: 之前的国家,由字母组成;
  • (\d{1,2}) 捕获由一位或两位数字组成但可选的日期(? 在组后),即可能丢失;
  • ([A-Za-z]+) 捕获由字母组成的月份,并用? 标记为可选;
  • (\d{4}) 捕获由四位数字组成的年份;

【讨论】:

  • 信息中缺少某些数据,例如 info 仅包含 USA:2013。这可以在国家和年份内表示,但 2013 位于 Date 列下。可以倒车或者其他方法吗?
  • 在 [17] 中:dataframe[['year', 'month', 'day']] = dataframe['release'].apply( lambda x: pd.Series(x.split( )[::-1]))
  • 我尝试了上面的代码来解决我的问题,但是国家名称和日期出现在列中。
【解决方案2】:

使用split字符串方法。

In [163]: df[['country', 'date', 'month', 'year']] = df['info'].str.split('\W+', expand=True)

In [164]: df
Out[164]:
   id  movie_id                  info country date     month  year
0   1         1  Italy:1 January 1994   Italy    1   January  1994
1   2         2   USA:22 January 2006     USA   22   January  2006
2   3         3  USA:12 February 2006     USA   12  February  2006
3   4         4  USA:19 February 2006     USA   19  February  2006
4   5         5   USA:22 January 2006     USA   22   January  2006

【讨论】:

  • 这项工作非常好,但我还有一个问题是:
  • info 中缺少一些数据,即:info 仅包含 'Italy:2013' 拆分后 2013 显示在 date* 列和 **month 下,年份没有。如何解决这个问题。
  • 您需要编写自定义函数。提示:stackoverflow.com/a/40069615/2137255
  • 你能不能把它弄成相反的形式,这样我就可以很容易地处理丢失的数据。示例:年、月、日、国家,因此缺少的值为无。
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2018-10-06
  • 2022-01-20
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多