如何将包含其他列中值出现次数的列附加到现有数据帧?

2024-10-01 07:41:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,其中包含从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

0和列1包含列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])这样的新列不起作用

我找到了一个解决方法:我为每个事件类型(pairhyponymhyperonym)创建了3个PandasSeries),并且我编写了一个小循环来计算每对事件的置信度得分,但由于原始数据集非常庞大(超过700万条记录),因此这种计算不是一种有效的方法(30小时后计算尚未完成)。因此,可行且希望有效的解决方案是为此目的使用Pandasapplymap(),但需要将包含引用的列附加到原始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是hyperonym部分(query)的出现次数,列7是成对(sql)的出现次数, query)。正如您所看到的,这对词是相同的,但它们是从不同的短语中提取出来的

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


Tags: 方法webdataframedfsqlvalueservicelinq
1条回答
网友
1楼 · 发布于 2024-10-01 07:41:33

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

# 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')

在编辑之前,我用一个使用值计数和合并的解决方案回答了这个问题。此原始解决方案比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

相关问题 更多 >