熊猫如何将给定字段拆分两次
Posted
技术标签:
【中文标题】熊猫如何将给定字段拆分两次【英文标题】:pandas how to split twice a given field 【发布时间】:2015-06-17 13:40:48 【问题描述】:我想计算列中的热门主题。有些字段有逗号或点我想用它们创建一个新行。
import pandas as pd
from pandas import DataFrame, Series
sbj = DataFrame(["Africa, Business", "Oceania",
"Business.Biology.Pharmacology.Therapeutics",
"French Litterature, Philosophy, Arts", "Biology,Business", ""
])
sbj
我想将任何包含“.”的字段拆分为一个新的字段。或“。”
sbj_top = sbj[0].apply(lambda x: pd.value_counts(x.split(",")) if not pd.isnull(x) else pd.value_counts('---'.split(","))).sum(axis = 0)
sbj_top
我在尝试重新拆分('.')时遇到错误(AttributeError
)
sbj_top = sbj_top.apply(lambda x: pd.value_counts(x.split(".")) if not pd.isnull(x) else pd.value_counts('---'.split(","))).sum(axis = 0)
sbj_top
我想要的输出
sbj_top.sort(ascending=False)
plt.title("Distribution of the top 10 subjects")
plt.ylabel("Frequency")
sbj_top.head(10).plot(kind='bar', color="#348ABD")
【问题讨论】:
你想要的输出是什么? 快速查看第一次拆分的输出会显示结果中的空格。您需要使用 trim()。 您要保留原始索引吗?例如,第一行应该变成“0, Africa”和“0, Business”吗? 嗨@cphlewis 我只想做value_counts()
这样我就可以做一个.plot()
【参考方案1】:
您可以将 Counter 与来自 itertools 的链一起使用。请注意,我在解析之前先将句点替换为逗号。
from collections import Counter
import itertools
from string import whitespace
trimmed_list = [i.replace('.', ',').split(',') for i in sbj[0].tolist() if i != ""]
item_list = [item.strip(whitespace) for item in itertools.chain(*trimmed_list)]
item_count = Counter(item_list)
>>> item_count.most_common()
[('Business', 3),
('Biology', 2),
('Oceania', 1),
('Pharmacology', 1),
('Philosophy', 1),
('Africa', 1),
('French Litterature', 1),
('Therapeutics', 1),
('Arts', 1)]
如果您需要 DataFrame 形式的输出:
df = pd.DataFrame(item_list, columns=['subject'])
>>> df
subject
0 Africa
1 Business
2 Oceania
3 Business
4 Biology
5 Pharmacology
6 Therapeutics
7 French Litterature
8 Philosophy
9 Arts
10 Biology
11 Business
【讨论】:
以上是关于熊猫如何将给定字段拆分两次的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用带有应用功能的熊猫 groupby 来解决副作用? (第一组申请两次)