Pandas 用逗号将列拆分为多列
Posted
技术标签:
【中文标题】Pandas 用逗号将列拆分为多列【英文标题】:Pandas split column into multiple columns by comma 【发布时间】:2016-10-02 17:07:14 【问题描述】:我正在尝试根据逗号/空格分隔将一列拆分为多列。
我的数据框目前看起来像
KEYS 1
0 FIT-4270 4000.0439
1 FIT-4269 4000.0420, 4000.0471
2 FIT-4268 4000.0419
3 FIT-4266 4000.0499
4 FIT-4265 4000.0490, 4000.0499, 4000.0500, 4000.0504,
我愿意
KEYS 1 2 3 4
0 FIT-4270 4000.0439
1 FIT-4269 4000.0420 4000.0471
2 FIT-4268 4000.0419
3 FIT-4266 4000.0499
4 FIT-4265 4000.0490 4000.0499 4000.0500 4000.0504
我的代码当前删除了 KEYS 列,我不知道为什么。谁能改进或帮助解决这个问题?
v = dfcleancsv[1]
#splits the columns by spaces into new columns but removes KEYS?
dfcleancsv = dfcleancsv[1].str.split(' ').apply(Series, 1)
【问题讨论】:
你想要pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)
IIUC
我知道你是一个显赫的人物,在这里享有很高的声誉,但如果你把它作为官方答案,我会接受。效果很好
@Eddwinn EdChum 这样做。确保你至少对他的评论投了赞成票。
@Eddwinn 另外,将他的答案发布为您自己给予 EdChum 的功劳。当您在 2 天内选择答案时,您将不会获得代表,这很好。如果其他人在 c'est la vie 之后投票赞成,EdChum 知道他在做什么。
我没有发布答案,因为太晚了,我无法确认这是否是你想要的,有时我也很忙
【参考方案1】:
如果其他人想要将单列(由值分隔)拆分为多列 - 试试这个:
series.str.split(',', expand=True)
这回答了我来这里寻找的问题。
归功于EdChum's 代码,其中包括将拆分列添加回数据框。
pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)
注意:第一个参数df[[0]]
是DataFrame
。
第二个参数df[1].str.split
是您要拆分的系列。
split Documentation
concat Documentation
【讨论】:
拆分时,我得到了 350 列,其中许多是空白的,是否有任何动态处理拆分的方法?【参考方案2】:使用 Edchums 的答案
pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)
我能够通过替换我的变量来解决它。
dfcleancsv = pd.concat([dfcleancsv['KEYS'], dfcleancsv[1].str.split(', ', expand=True)], axis=1)
【讨论】:
【参考方案3】:OP 具有可变数量的输出列。 在输出列数固定的特定情况下,另一个命名结果列的优雅解决方案是使用多重赋值。
加载样本数据集并将其重塑为长格式以获得变量
叫organ_dimension
。
import seaborn
iris = seaborn.load_dataset('iris')
df = iris.melt(id_vars='species', var_name='organ_dimension', value_name='value')
根据_
分隔符将organ_dimension
变量拆分为organ
和dimension
两个变量。
df[['organ', 'dimension']] = df['organ_dimension'].str.split('_', expand=True)
df.head()
Out[10]:
species organ_dimension value organ dimension
0 setosa sepal_length 5.1 sepal length
1 setosa sepal_length 4.9 sepal length
2 setosa sepal_length 4.7 sepal length
3 setosa sepal_length 4.6 sepal length
4 setosa sepal_length 5.0 sepal length
基于this answer“如何将一列拆分为两列?”
【讨论】:
如果警告“FutureWarning:在未来版本中将弃用字符的列迭代。使用 df[['organ', 'dimension']] = df['organ_dimension'].str.split ('_', expand=True) @MarkK 谢谢我更新了答案以使用您建议的分配。【参考方案4】:使用下面的矢量化效果更好:
df = df.apply(lambda x:pd.Series(x))
【讨论】:
【参考方案5】:也许这应该可行:
df = pd.concat([df['KEYS'],df[1].apply(pd.Series)],axis=1)
【讨论】:
【参考方案6】:看看这个
Responder_id LanguagesWorkedWith
0 1 html/CSS;Java;javascript;Python
1 2 C++;HTML/CSS;Python
2 3 HTML/CSS
3 4 C;C++;C#;Python;SQL
4 5 C++;HTML/CSS;Java;JavaScript;Python;SQL;VBA
... ... ...
87564 88182 HTML/CSS;Java;JavaScript
87565 88212 HTML/CSS;JavaScript;Python
87566 88282 Bash/Shell/PowerShell;Go;HTML/CSS;JavaScript;W...
87567 88377 HTML/CSS;JavaScript;Other(s):
87568 88863 Bash/Shell/PowerShell;HTML/CSS;Java;JavaScript...`
###Split the LanguagesWorkedWith column into multiple columns by using` data= data1['LanguagesWorkedWith'].str.split(';').apply(pd.Series)`.###
` data1 = pd.read_csv('data.csv', sep=',')
data1.set_index('Responder_id',inplace=True)
data1
data1.loc[1,:]
data= data1['LanguagesWorkedWith'].str.split(';').apply(pd.Series)
data.head()`
【讨论】:
【参考方案7】:您可能还想尝试datar
,一个包端口dplyr
,tidyr
和相关的R包到python:
>>> df
i j A
<object> <int64> <object>
0 AR 5 Paris,Green
1 For 3 Moscow,Yellow
2 For 4 NewYork,Black
>>> from datar import f
>>> from datar.tidyr import separate
>>> separate(df, f.A, ['City', 'Color'])
i j City Color
<object> <int64> <object> <object>
0 AR 5 Paris Green
1 For 3 Moscow Yellow
2 For 4 NewYork Black
【讨论】:
以上是关于Pandas 用逗号将列拆分为多列的主要内容,如果未能解决你的问题,请参考以下文章