微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 将行值转换为列,并计算所有可能值mysql的重复次数

我有一个表(来自日志文件)的电子邮件和其他三个列,其中包含该用户与系统交互的状态,电子邮件(用户)可能有100或1000个条目,每个条目包含这三个值组合,可能会重复同样的电子邮件和其他人.
看起来像这样:

+---------+---------+---------+-----+
| email |  val1   |  val2 |  val3   |
+---------+---------+---------+-----+
|jal@h  |  cast   | core  |   cam   |
|hal@b  |little ja| qar   |  ja sa  |
|bam@t  |  cast   | core  |   cam   |
|jal@h  |little ja| qar   |  jaja   | 
+---------+---------+---------+-----+

所以,电子邮件重复,所有值都重复,每列有40个可能的值,所有字符串.所以我想对不同的电子邮件进行排序,然后将所有可能的值作为列名称,并在其下计算特定电子邮件重复的这个值的数量,如下所示:

+-------+--------+--------+------+----------+-----+--------+-------+
| email | cast   |   core |  cam | little ja| qar |  ja sa | blabla |
+-------+--------+--------+------+----------+-----+--------+--------|
|jal@h  |  55    |   2    | 44   |   244    | 1   | 200    | 12     |
|hal@b  |  900   |  513   | 101  |   146    |  2  |  733   | 833    |
|bam@t  |  1231  |   33   | 433  |   411    | 933 | 833    | 53     |
+-------+--------+--------+------+----------+-----+--------+---------

我尝试过MysqL,但我设法为每封电子邮件计算一定值的总出现次数,但不计算每列中的所有可能值:

SELECT 
  distinct email,

  count(val1) as "cast"
FROM table1
where val1 = 'cast'
group by email

这个查询显然没有这样做,因为它仅从第一列’val1’的值’cast’输出,我正在寻找的是第一,第二和第三列中的所有不同值都被转换为列头和对于某个电子邮件用户”,行中的值将是该值的总和.
一个关键的桌子的东西,但我无法让它工作.
我在MysqL中将这些数据作为一个表来处理,但它在csv文件中可用,所以如果查询不可能,python将是一个可能的解决方案,并且在sql之后是首选.

更新
在python中,是否可以输出数据:

+-------+--------+---------+------+----------+-----+--------+-------+
|       |     val1         |      val2       |     val3              |
+-------+--------+---------+------+----------+-----+--------+-------+
| email | cast   |little ja|core  | qar      |cam  | ja sa  | jaja   |
+-------+--------+---------+------+----------+-----+--------+--------|
|jal@h  |  55    |   2     | 44   |   244    | 1   | 200    | 12     |
|hal@b  |  900   |  513    | 101  |   146    |  2  |  733   | 833    |
|bam@t  |  1231  |   33    | 433  |   411    | 933 | 833    | 53     |
+-------+--------+--------+------+----------+-----+--------+---------

我对python不太熟悉.

解决方法:

如果您使用pandas,则可以在通过电子邮件对数据框进行分组后执行value_counts,然后将其取消堆叠/转换为宽格式:

(df.set_index("email").stack().groupby(level=0).value_counts()
   .unstack(level=1).reset_index().fillna(0))

enter image description here

获取更新的结果,您可以在堆栈后按电子邮件和val *列进行分组:

(df.set_index("email").stack().groupby(level=[0, 1]).value_counts()
   .unstack(level=[1, 2]).fillna(0).sort_index(axis=1))

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐