如何解决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
我想要的是成员2
为ddd
,成员2
为eee
我还想添加一个 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
)。现在我们可以将每个 True
的 member
相加得到 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
我们快到了;我们可以使用 True
将 False
/"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] 举报,一经查实,本站将立刻删除。