计算每个单元格有多个元素的数据框中的所有出现次数
Count all occurrences in a dataframe with multiple elements per cell
我正在尝试计算每个单元格中有多个元素的数据框中的所有出现次数。
我有一个由 2 列组成的原始数据框,每行都有多个元素:
index x1 x2
0 "foo;bar;baz" "baz;qux;quux"
1 "foo;baz" "baz;foo;quux"
2 "quux" "quux"
我想知道每一行的首选项。也许看这个维恩图更容易。
根据图像,例如索引 0 将是:
- love = baz(这是x1和x2的交集)
- hate = foo, bar(这是x1和x2的区别)
- want = qux, quux(这是x2和x1的区别)。
我通过以下方式成功地创建了一个包含所有这些偏好的新数据框:
df2['love'] = [set(x[0].split(';')) & set(x[1].split(';')) for x in df.values]
df2['hate'] = [set(x[0].split(';')) - set(x[1].split(';')) for x in df.values]
df2['want'] = [set(x[1].split(';')) - set(x[0].split(';')) for x in df.values]
它给了我:
love hate want
0 {baz} {foo, bar} {qux,quux}
1 {foo, baz} {} {quux}
2 {quux} {} {}
我现在想计算每一列的所有出现次数。这是一个新的数据框,看起来像这样:
index love hate want
bar 0 1 0
baz 2 0 0
foo 1 1 0
qux 0 0 1
quux 1 0 2
我已经有了列中可能存在的所有可能名称的列表:
leng=[]
for l in df['x1'].apply(lambda x: x.split(';')):
leng=np.unique(np.append(leng, l))
我尝试了 collections.Counter(itertools.chain.from_iterable(v.split(';') for v in list(df3.love))).values()
但现在的问题是每次我尝试使用 .split() 或 .value_counts() 来计算新数据帧时,我都会得到 [=16= 的不同变体]
我必须说我的真实数据框有超过 80k 行,所以我希望有一个有效的解决方案。
谢谢。
您应该遍历 DataFrame 的列:
df_counts = (
pd.DataFrame([Counter(chain.from_iterable(df3[column]))
for column in df3.columns],
index=['love', 'hate', 'want'])
.fillna(0)
.T
.sort_index()
)
我正在尝试计算每个单元格中有多个元素的数据框中的所有出现次数。
我有一个由 2 列组成的原始数据框,每行都有多个元素:
index x1 x2
0 "foo;bar;baz" "baz;qux;quux"
1 "foo;baz" "baz;foo;quux"
2 "quux" "quux"
我想知道每一行的首选项。也许看这个维恩图更容易。
根据图像,例如索引 0 将是:
- love = baz(这是x1和x2的交集)
- hate = foo, bar(这是x1和x2的区别)
- want = qux, quux(这是x2和x1的区别)。
我通过以下方式成功地创建了一个包含所有这些偏好的新数据框:
df2['love'] = [set(x[0].split(';')) & set(x[1].split(';')) for x in df.values]
df2['hate'] = [set(x[0].split(';')) - set(x[1].split(';')) for x in df.values]
df2['want'] = [set(x[1].split(';')) - set(x[0].split(';')) for x in df.values]
它给了我:
love hate want
0 {baz} {foo, bar} {qux,quux}
1 {foo, baz} {} {quux}
2 {quux} {} {}
我现在想计算每一列的所有出现次数。这是一个新的数据框,看起来像这样:
index love hate want
bar 0 1 0
baz 2 0 0
foo 1 1 0
qux 0 0 1
quux 1 0 2
我已经有了列中可能存在的所有可能名称的列表:
leng=[]
for l in df['x1'].apply(lambda x: x.split(';')):
leng=np.unique(np.append(leng, l))
我尝试了 collections.Counter(itertools.chain.from_iterable(v.split(';') for v in list(df3.love))).values()
但现在的问题是每次我尝试使用 .split() 或 .value_counts() 来计算新数据帧时,我都会得到 [=16= 的不同变体]
我必须说我的真实数据框有超过 80k 行,所以我希望有一个有效的解决方案。
谢谢。
您应该遍历 DataFrame 的列:
df_counts = (
pd.DataFrame([Counter(chain.from_iterable(df3[column]))
for column in df3.columns],
index=['love', 'hate', 'want'])
.fillna(0)
.T
.sort_index()
)