拆分Dataframe列值并分配给其他列,Python 3.6

时间:2017-09-14 11:32:23

标签: python python-3.x pandas split

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

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而不是

2 个答案:

答案 0 :(得分:3)

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会发出警告。

答案 1 :(得分:1)

使用列表理解。在这种情况下至少(没有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