【问题标题】:Splitting Dataframe column values and assigning to other columns, Python 3.6拆分数据框列值并分配给其他列,Python 3.6
【发布时间】:2018-02-23 08:55:36
【问题描述】:

我在数据框中有以下数据,并希望从第一次出现的 ; 中拆分出来

df:

IT;3P;J;1;C;A;TO1;A;A;A;I
KR;3P;J;1;C;A;TO1;A;A;A;I
MX;3P;J;1;C;A;TO1;A;A;A;I
NL;3P;J;1;C;A;TO1;A;A;A;I
NZ;3P;J;1;C;A;TO1;A;A;A;I
PH;3P;J;1;C;A;TO1;A;A;A;I
PT;3P;J;1;C;A;TO1;A;A;A;I
RU;3P;J;1;C;A;TO1;A;A;A;I
SG;3P;J;1;C;A;TO1;A;A;A;I
TR;3P;J;1;C;A;TO1;A;A;A;I
US;3P;J;1;C;A;TO1;A;A;A;I

df['itemNew'] = df['item'].str.split(';', 1)[1]

给出错误:ValueError:值的长度与索引的长度不匹配

新列中的预期结果如下:

3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I
3P;J;1;C;A;TO1;A;A;A;I

试过这个:

df['itemNew'] = ''
df['itemNew'] = df['item'].str.split(';', 1).str[1]

出现警告消息: SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用 .loc[row_indexer,col_indexer] = value

【问题讨论】:

  • 试试:df = df.assign(itemNew=df['item'].str.split(';', 1).str[1])
  • 或者只是删除第一行。

标签: python python-3.x pandas split


【解决方案1】:

看来您需要str 来选择由split 创建的第二个列表:

df['itemNew'] = df['item'].str.split(';', 1).str[1]

使用copy

df= Mapping.loc[Mapping['DatasetId'].isin(['bisdss2016', 'imffsi2017apr', 'imfifss2017', 'imfifss2017aug', 'wbdb2016oct'])].copy()

如果您稍后修改 df 中的值,您会发现修改不会传播回原始数据 (Mapping),并且 Pandas 会发出警告。

【讨论】:

  • 超级工作正常,,但是我收到了一些警告消息:“正在尝试在 DataFrame 的切片副本上设置值。”
  • 我认为它在上面的代码中。你能在上面显示你的 2 行代码吗?
  • 如果也删除df['itemNew'] = ''警告?
  • 是的,实际上我通过过滤一些值来创建 df,例如 df= Mapping.loc[Mapping['DatasetId'].isin(['bisdss2016', 'imffsi2017apr', 'imfifss2017', 'imfifss2017aug' , 'wbdb2016oct'])]
  • @faithon.gvr.py 试试df = Mapping.loc[Mapping['DatasetId'].isin(['bisdss2016', 'imffsi2017apr', 'imfifss2017', 'imfifss2017aug', 'wbdb2016oct'])].copy()
【解决方案2】:

使用列表推导。至少在这种情况下(没有 NaNs),它比 str.methods 快 2 倍

In [233]: df['itemNew'] = [x.split(';', 1)[1] for x in df['item'].values]

时机,这也让我感到惊讶。

In [229]: df.shape
Out[229]: (11000, 1)

In [230]: %timeit [x.split(';', 1)[1] for x in df['item'].values]
100 loops, best of 3: 5.42 ms per loop

In [231]: %timeit df['item'].str.split(';', 1).str[1]
100 loops, best of 3: 11.4 ms per loop

【讨论】:

  • 可以,但不支持NaN
  • 如果一些 NaN 失败。所以str. 方法更慢,因为使用 NaN 很好。
  • 好点。我会让 OP 根据他们的数据来决定,如果 NaN 永远不会发生或更早处理,最好不要在这里使用str.method
  • @John Galt,谢谢你的新方法……我也会试试这个
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多