首页 > 解决方案 > 如何将包含其他列中值出现次数的列附加到现有数据框?

问题描述

我有一个数据框,其中包含从 StackOverflow 帖子中提取的下位词和上位词对。您可以在以下内容中看到其中的摘录:

0           1                   2       3   4
linq query  asmx web service    THH     10  a linq query as an asmx web service
application bolt                THH     1   my application is a bolt on data visualization...
area        r time              THH     1   the area of the square is r times
sql         query syntax        HTH     3   sql like query syntax

...

7379596 rows × 5 columns

column0和 column1包含该 column 所包含的短语的下位词和上位词部分4。我想实现一个基于统计特征的过滤器,因此我必须将所有出现的对(0, 1)列一起计数,分别计算所有出现的下义词和上义词部分。Pandas 有一个名为 的方法value_counts(),因此可以通过以下方式计算出现次数:

df.value_counts([0])
df.value_counts([1])
df.value_counts([0, 1])

这很好,但是该方法导致 PandasSeries的记录比原来的少得多DataFrame,因此,添加一个新列是df[5] = df.value_counts([0, 1])行不通的。

我找到了一种解决方法:我Series为每种出现类型(pair、、、 )创建了 3 个 Pandas hyponymhyperonym并且我编写了一个小循环来计算每一对的置信度分数,但由于原始数据集很大(超过 700 万条记录),所以这个计算不是一种有效的方法(30 小时后计算尚未完成)。因此,可行且希望有效的解决方案是applymap()为此目的使用 Pandas,但需要将包含出现的列附加到原始DataFrame. 所以我想要一个DataFrame这样的:

0      1           2           3         4               5      6     7
sql    query       anything    anything  a phrase        1000   800   500
sql    query       anything    anything  anotherphrase   1000   800   500
...

5是下位词部分 ( sql)6的出现次数,列是上位词部分 ( query) 的出现次数,列7是对 ( sql, query) 的出现次数。如您所见,这些对是相同的,但它们是从不同的短语中提取的。

我的问题是如何做到这一点?如何将事件作为新列附加到现有的DataFrame

标签: pythonpython-3.xpandasdataframe

解决方案


这是有关如何将两列组合的值计数映射到新列的解决方案:

# Create an example DataFrame
df = pd.DataFrame({0: ["a", "a", "a", "b"], 1: ["c", "d", "d", "d"]})

# Count the paired occurrences in a new column
df["count"] = df.groupby([0,1])[0].transform('size')

在编辑之前,我已经通过使用 value_counts 和合并的解决方案回答了这个问题。这个原始的解决方案比 groupby 更慢更复杂:

# Put the value_counts in a new DataFrame, call them count
vcdf = pd.DataFrame(df[[0, 1]].value_counts(), columns=["count"])

# Merge the df with the vcs
merged = pd.merge(left=df, right=vcdf, left_on=[0, 1], right_index=True)

# Potentially sort index
merged = merged.sort_index()

生成的数据框:

   0  1  count
0  a  c      1
1  a  d      2
2  a  d      2
3  b  d      1

推荐阅读