Python 计算行频率并生成输出文件

Python 计算行频率并生成输出文件,python,Python,使用如下文本文件: a;b b;a c;d d;c e;a f;g h;b b;f b;f c;g a;b d;f 如何读取它,并生成两个输出文本文件:一个只保留代表每个字母最常出现的两行;还有一个是保留所有的夫妇,包括最常见的25%的信件中的任何一封 很抱歉没有共享任何代码。我尝试了很多关于列表理解、计数和熊猫的东西,但不够流利 这里是一个没有冻结集的答案 df1 = df.apply(sorted, 1) df_count =df1.groupby(['A', 'B']).size().r

使用如下文本文件:

a;b
b;a
c;d
d;c
e;a
f;g
h;b
b;f
b;f
c;g
a;b
d;f
如何读取它,并生成两个输出文本文件:一个只保留代表每个字母最常出现的两行;还有一个是保留所有的夫妇,包括最常见的25%的信件中的任何一封


很抱歉没有共享任何代码。我尝试了很多关于列表理解、计数和熊猫的东西,但不够流利

这里是一个没有冻结集的答案

df1 = df.apply(sorted, 1)
df_count =df1.groupby(['A', 'B']).size().reset_index().sort_values(0, ascending=False)
df_count.columns = ['A', 'B', 'Count']

df_all = pd.concat([df_count.assign(letter=lambda x: x['A']), 
                    df_count.assign(letter=lambda x: x['B'])]).sort_values(['letter', 'Count'], ascending =[True, False])

df_first = df_all.groupby(['letter']).first().reset_index()

top = int(len(df_count) / 4)
df_top_25 = df_count.iloc[:top]
------------老答案--------

因为顺序很重要,所以可以使用冻结集作为groupby的键

import pandas as pd
df = pd.read_csv('text.csv', header=None, names=['A','B'], sep=';')
s = df.apply(frozenset, 1)
df_count = s.value_counts().reset_index()
df_count.columns = ['Combos', 'Count']
这会给你这个

   Combos  Count
0  (a, b)      3
1  (b, f)      2
2  (d, c)      2
3  (g, f)      1
4  (b, h)      1
5  (c, g)      1
6  (d, f)      1
7  (e, a)      1
为了获得每个字母的最高组合,我们将把这个数据框连接在它的顶部,并创建另一个列来容纳第一个或第二个字母

df_a = df_count.copy()
df_b = df_count.copy()

df_a['letter'] = df_a['Combos'].apply(lambda x: list(x)[0])
df_b['letter'] = df_b['Combos'].apply(lambda x: list(x)[1])

df_all = pd.concat([df_a, df_b]).sort_values(['letter', 'Count'], ascending =[True, False])
因为这是按字母和计数(降序)排序的,所以只需要得到每组的第一行

df_first = df_all.groupby('letter').first()
要想获得前25%,只需使用

top = int(len(df_count) / 4)
df_top_25 = df_count.iloc[:top]

然后使用
。\u csv
输出到文件。

共享示例输出顺序是否重要?例如,将
a;b
b;a
是一对反复出现的夫妇吗?是的,在给出答案之前,你需要准确地定义一对夫妇首先是什么。熊猫将是一个很好的工具。请添加示例输出。这个问题不是很重要clear@textnet
应为
名称
。固定在下面。我总是把这场争论弄糊涂。我做得很好。非常感谢。
.to_csv
文件的行看起来像这样
a;冻结集(['a','b']);3
在第一种情况下,与此类似
0;冻结集(['a','b']);3
在第二行。以任何平滑的方式将它们都格式化为
a;b
标题为
source
target
?要摆脱冻结集,请使用下半部分中所做的操作
df['source']=df['Combos'].apply(lambda x:list(x)[0])
df['target']=df['Combos'].apply(lambda x:list(x)[0])
并删除不必要的列。是否可以修改代码
df_count=df.groupby(['source','target']).size().reset_index().sort_值(0,升序=False)
df_count.columns=['source','target','weight']
以使方向不重要,即a;b与b一起计算;a?在其上面的步骤中使用“应用并排序”对其进行修改。