【问题标题】:How to groupeby and paste string in python如何在python中分组和粘贴字符串
【发布时间】:2017-09-01 14:48:23
【问题描述】:

我的数据如下所示。

ID              Position            Treatment
--20AxECvv-         0           A
--20AxECvv-         -1          C
--20AxECvv-         -2          B
--h9INKewQf-        0           A
--h9INKewQf-        -1          B
zZU7a@8jN           0           C
QUeSNEXmdB          0           C
QUeSNEXmdB          -1          A
qu72Ql@h79          0           C

问题 1:

我想让一个用户 (id) 根据其位置进行所有处理并用“-”分隔。

结果是:

ID                       Treatment

--20AxECvv-              B-C-A
--h9INKewQf-             B-A
zZU7a@8jN                C
QUeSNEXmdB               A-C
qu72Ql@h79               C

问题 2

在了解所有治疗路径后,我想计算治疗 C(安慰剂)与 A 和 B 的次数。

Outcome : 
treatment (placebo)          other treatment           times
C                            A                         2
C                            B                         1

以及人们最后服用了多少次(当患者服用其他人时)

Outcome : 
treatment placebo in last          other treatment           times
C                            A                                1
C                            B                                0

提前感谢您花一些时间来回答这些问题:)

【问题讨论】:

  • 你在使用 Pandas 吗?这不是标签,所以不清楚。
  • 是的,抱歉我会编辑标签

标签: python string pandas group-by multiple-columns


【解决方案1】:

我认为你想要 groupby 和 sum

>>> y = pandas.DataFrame(columns=["x", "treatment"], data=[[0,"a"],[1,"b"],[0,"c"]])
>>> y
   x treatment
0  0         a
1  1         b
2  0         c

>>> y.groupby("x").sum()
  treatment
x          
0        ac
1         b

Sum 将连接字符串,因为 python 中的 "a" + "b" = "ab"

如果您需要用字符串分隔的治疗方法,请尝试

>>> y.groupby("x")["treatment"].apply("-".join)
x
0    a-c
1      b

【讨论】:

  • 不过是简化数据,有很多不同的处理方式....
  • 好的,我已经编辑了我的答案,以包括一种方法来保持治疗由字符串分隔。这就是你要找的东西吗?
  • 我有这个错误:TypeError: sequence item 0: expected str instance, float found
  • 您可以尝试使用astype(str) 将列转换为字符串,但我认为您可能应该检查您的数据。处理标签是浮点数吗?我假设不是。您可能选择了错误的列。
  • 处理标签是字母、数字和特定字符如“/”或“-”的组合
【解决方案2】:

问题 1 的解决方案:

import pandas as pd

df = pd.read_table('yourfile', header=None, delim_whitespace=True, skiprows=1)
df.columns = ['ID','Position','Treatment']
grouped = df.sort_values('Position').groupby('ID')
grouped = grouped.agg(lambda x: '-'.join(x)).reset_index()

print(grouped) 

输出:

             ID Treatment
0   --20AxECvv-     B-C-A
1  --h9INKewQf-       B-A
2    QUeSNEXmdB       A-C
3    qu72Ql@h79         C
4     zZU7a@8jN         C

【讨论】:

  • 你好,当我这样做时,每行的结果是列位置和 tratment 包含:“id - posiiton -treatment”
  • @AnnaCarrere,你是什么意思?我已将您的输入复制粘贴到文件中,应用了我的方法并给出了预期的结果
  • 除了第一行 (df = pd.read_table('yourfile', header=None, delim_whitespace=True, skiprows=1) 之外,我所做的一切都非常出色,因为我已经从以前的代码中获得了我的表格处决。
  • 你的意思是,你的输入数据不包含行ID Position Treatment ?
  • 不,它包含。但输出仅包含具有 id-treatment-position 的行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多