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

Python Pandas:相同值出现在同一行的不同列中的次数

如何解决Python Pandas:相同值出现在同一行的不同列中的次数

我有一个广泛的数据集,我正在尝试计算列 2019_5 中的值为同一成员出现了多少次,以及它是否连续。我设法想出的最好的是 dataframe['number_yrs'] = 5 - dataframe.isnull().sum(axis=1) 它给出了以下内容。问题是它只看是否有 NaN,而不是值是否等于 2019_5

  member  2015_5  2016_5  2017_5  2018_5  2019_5  number_yrs
0    aaa     NaN     NaN     NaN     NaN      12           1
1    bbb     7.0     7.0     7.0     7.0       7           5
2    ccc    10.0    10.0     NaN     NaN      10           3
3    ddd    12.0     NaN     NaN     7.0       7           3
4    eee    12.0     NaN    10.0     NaN      10           3

我想要的是成员2ddd,成员2eee

我还想添加一个 continuous 列,它是 y/n 并指示 number_yrs 是否连续。我希望当一切都说完并完成(正确)时它会看起来像这样

  member  number_yrs continuous
0    aaa           1          n
1    bbb           5          y
2    ccc           3          n
3    ddd           2          y
4    eee           2          n

解决方法

试试:

df["number_yrs"] = df.filter(regex="_5$").apply(
    lambda x: x.eq(x["2019_5"]).sum(),axis=1
)
df["continuous"] = np.where(
    df.filter(regex="_5$").apply(
        lambda x: sorted(m := x.eq(x["2019_5"])) == m.tolist() and m.sum() > 1,axis=1,),"y","n",)
print(df)

打印:

  member  2015_5  2016_5  2017_5  2018_5  2019_5  number_yrs continuous
0    aaa     NaN     NaN     NaN     NaN      12           1          n
1    bbb     7.0     7.0     7.0     7.0       7           5          y
2    ccc    10.0    10.0     NaN     NaN      10           3          n
3    ddd    12.0     NaN     NaN     7.0       7           2          y
4    eee    12.0     NaN    10.0     NaN      10           2          n
,

对于 number_yrs,您可以将 2019_5 列与整个数据框进行比较(但转置以确保对齐,因为后者将是一个系列):

# keep `member` column aside from calculations
>>> df = df.set_index("member")
>>> df.T == df["2019_5"]

member    aaa   bbb    ccc    ddd    eee
2015_5  False  True   True  False  False
2016_5  False  True   True  False  False
2017_5  False  True  False  False   True
2018_5  False  True  False   True  False
2019_5   True  True   True   True   True

如您所见,这将返回一个布尔框架,其中每个条目都被标记为它们是否等于每行 2019_5 的值(并且最后一行如预期的那样已满 True)。现在我们可以将每个 Truemember 相加得到 number_yrs

>>> (df.T == df["2019_5"]).sum(axis=0)

member
aaa    1
bbb    5
ccc    3
ddd    2
eee    2

至于连续性,我们可以查看2018_5的值,看看每行是否与2019_5的值相同:

>>> df["2018_5"] == df["2019_5"]

member
aaa    False
bbb     True
ccc    False
ddd     True
eee    False

我们快到了;我们可以使用 TrueFalse/"y" 值映射到 "n"/map

>>> (df["2018_5"] == df["2019_5"]).map({True: "y",False: "n"})

member
aaa    n
bbb    y
ccc    n
ddd    y
eee    n

所以我们有需要的新列。将它们放在一起并将它们分配给数据框:

df["number_yrs"] = (df.T == df["2019_5"]).sum(axis=0)
df["continuous"] = (df["2018_5"] == df["2019_5"]).map({True: "y",False: "n"})

给予

>>> df

        2015_5  2016_5  2017_5  2018_5  2019_5  number_yrs continuous
member
aaa        NaN     NaN     NaN     NaN      12           1          n
bbb        7.0     7.0     7.0     7.0       7           5          y
ccc       10.0    10.0     NaN     NaN      10           3          n
ddd       12.0     NaN     NaN     7.0       7           2          y
eee       12.0     NaN    10.0     NaN      10           2          n

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