gpt4 book ai didi

python - Pandas wide_to_long - 保留带有值的行 i 或仅保留一行空白

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:39 25 4
gpt4 key购买 nike

我正在尝试将数据框转换为长格式,并希望按照以下规则保留记录:

(1) 如果 id 在 stub 中有数据 - 保留所有非空的“长”记录,删除空的(2) 如果id在任何 stub 中都没有数据,则只保留它的1条“长”记录

换句话说,对于每个 id 我需要至少保留一条记录:- 如果 id 在 stub 中没有数据,则只有一条记录,- 或者 id 填入 stub 中的行数

我正在使用 wide_to_long,因为它允许使用 stubnames,而 melt 不允许(或者至少我不知道如何使用)。这是示例代码(灵感来自 wide_to_long 上的官方 pandas 文档):

import numpy as np
import pandas as pd

np.random.seed(123)
df = pd.DataFrame({"A2001" : {0 : "a", 1 : "b", 2 : "c",3:""},
"A2002" : {0 : "d", 1 : "e", 2 : "",3:""},
"A2003" : {0 : "g", 1 : "h", 2 : "i",3:""},
"A2004" : {0 : "j", 1 : "k", 2 : "l",3:""},
})

df["id"] = df.index
pd.wide_to_long(df, ["A"], i="id", j="year")

输出是:

         A
id year
0 2001 a
1 2001 b
2 2001 c
3 2001
0 2002 d
1 2002 e
2 2002
3 2002
0 2003 g
1 2003 h
2 2003 i
3 2003
0 2004 j
1 2004 k
2 2004 l
3 2004

我需要达到的目标:对于 id 0、1 和 2,我需要那些 ["A"] 为空白(或 NaN)的行;对于 id 3 - 我需要保留 1 行(任何一行,哪一行都无关紧要):

         A
id year
0 2001 a
1 2001 b
2 2001 c
3 2001
0 2002 d
1 2002 e
0 2003 g
1 2003 h
2 2003 i
0 2004 j
1 2004 k
2 2004 l

我试过这个:

df.dropna(axis=0,how="all",subset=["A"]) 

但它会删除 id 3 的所有行

编辑:

我也在寻找一个通用的解决方案,其中包含一个 stub 名称列表:

df = pd.DataFrame({"A2001" : {0 : "a", 1 : "b", 2 : "",3:""},
"A2002" : {0 : "d", 1 : "e", 2 : "test",3:""},
"A2003" : {0 : "g", 1 : "h", 2 : "i",3:""},
"A2004" : {0 : "j", 1 : "k", 2 : "l",3:""},
"B2001" : {0 : "a", 1 : "b", 2 : "",3:""},
"B2002" : {0 : "d", 1 : "e", 2 : "",3:""},
"B2003" : {0 : "g", 1 : "h", 2 : "i",3:""},
"B2004" : {0 : "j", 1 : "k", 2 : "l",3:""},
})

pd.wide_to_long(df, ["A","B"], i="id", j="year")

我需要删除 A 和 B 列都为空的行,但仍然为每个 id 保留至少 1 条记录(如果 A 和 B 均为空白,则只保留一条记录)

最佳答案

按照你的条件和逻辑

df["id"] = df.index
s=pd.wide_to_long(df, ["A"], i="id", j="year")
s=s.groupby(level=0).A.apply(lambda x : x.head(1) if (x=='').all() else x[x!='']).reset_index(level=0,drop=True)
s.sort_index(level=1)

Out[137]:
id year
0 2001 a
1 2001 b
2 2001 c
3 2001
0 2002 d
1 2002 e
0 2003 g
1 2003 h
2 2003 i
0 2004 j
1 2004 k
2 2004 l
Name: A, dtype: object

关于python - Pandas wide_to_long - 保留带有值的行 i 或仅保留一行空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56363582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com