计算线路频率并生成输出文件

时间:2016-12-10 13:38:06

标签: python

使用这样的文本文件:

DELIMITER $$

CREATE PROCEDURE `transaction_sp` (@facebook_id varchar(50))
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
BEGIN

DECLARE exit handler for sqlexception
  BEGIN
    -- ERROR
  ROLLBACK;
END;

DECLARE exit handler for sqlwarning
 BEGIN
    -- WARNING
 ROLLBACK;
END;

START TRANSACTION;
DELETE FROM user_facebook WHERE id = @facebook_id;
DELETE FROM `user_oauth` WHERE facebook_id = @facebook_id;
COMMIT;
END
$$

如何读取它,并生成两个输出文本文件:一个只保留代表每个字母最常出现的对的行;并且保留所有夫妻,包括最常见的25%的最常见的信件。

很抱歉不共享任何代码。一直在尝试使用列表推导,计数和熊猫的大量内容,但不够流畅。

1 个答案:

答案 0 :(得分:1)

这是一个没有冻结的答案。

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]

然后使用.to_csv输出到文件。