Python Pandas-列中groupby之后的Concat字符串,忽略NaN,忽略重复项
根据查询的不同,my DF可以有一个带字符串的列,也可以有一个带NaN的列 例: 或 我可以处理其中一个,但当我尝试创建一个通用函数时,我失败得很惨。最后我需要忽略NaN,因为我将此DF作为JSON响应发送,而NaN给出的格式无效 我现在的做法是:Python Pandas-列中groupby之后的Concat字符串,忽略NaN,忽略重复项,python,python-3.x,pandas,nan,missing-data,Python,Python 3.x,Pandas,Nan,Missing Data,根据查询的不同,my DF可以有一个带字符串的列,也可以有一个带NaN的列 例: 或 我可以处理其中一个,但当我尝试创建一个通用函数时,我失败得很惨。最后我需要忽略NaN,因为我将此DF作为JSON响应发送,而NaN给出的格式无效 我现在的做法是: #When Projects is a string df['Projects'] = _df.groupby("ID")['External_Id'].apply(lambda x: ",".join(x)) #When Projects is
#When Projects is a string
df['Projects'] = _df.groupby("ID")['External_Id'].apply(lambda x: ",".join(x))
#When Projects is NaN
df['Projects'] = _df.groupby("ID")['External_Id'].apply(lambda x: "")
我试图使用fillna()
并检查“x”的数据类型,但它总是作为对象返回,因此我无法检查它是str还是NaN
此外,“项目”列的结果不允许重复。某些按ID分组的行具有重要信息,这些信息将被求和(“grams”),但“External_ID”不应出现多次。
例:
结果应该是
ID grams Projects
0 890 3.0 P1, P2
1 724 2.0 P1
而不是
ID grams Projects
0 890 1.0 P1, P2, P2
1 724 1.0 P1, P1
我认为这应该有帮助:
import numpy
df_new = df.replace(numpy.nan,' ', regex=True)
编辑:
我认为这可能对你有用(就像@Ami的答案的替代品。假设你从
In [37]: df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': [1, None, 2, 4], 'c': ['foo', 'sho', 'sha', 'bar']})
In [43]: df
Out[43]:
a b c
0 1 1.0 foo
1 1 NaN foo
2 2 2.0 sha
3 2 4.0 bar
然后,您可以对b
或c
应用相同的功能,以处理NAN和重复项:
In [44]: df.b.groupby(df.a).apply(lambda x: '' if x.isnull().any() else ','.join(set(x.astype(str).values)))
Out[44]:
a
1
2 2.0,4.0
dtype: object
In [45]: df.c.groupby(df.a).apply(lambda x: '' if x.isnull().any() else ','.join(set(x.astype(str).values)))
Out[45]:
a
1 foo
2 sha,bar
dtype: object
如果我理解正确,您需要检测列是否有NaN?是的,您是正确的。如果列有NaN,我希望返回空字符串(“”),因为它在JSON对象中无效。“忽略重复项”是什么意思?它在标题中,但在问题主体中似乎没有。你是对的,我忘了解释。我将添加到主体中。我基本上有一些行具有相同的ID和相同的项目。行上的其他信息对于计数/分析很重要,但例如,项目应该只显示一次,而不是“P1,P1,P1…”连接时。所有的NAN是否与同一个项目相关?如果您能为输入数据提供一个示例,那将非常好。这很好,但这就是我所说的忽略重复项。它现在返回一堆逗号。例如:“,,,”抱歉,我想我不明白,你想要什么作为输出?抱歉,@vlad.rad,我编辑了我的问题。我只想在没有项目的情况下使用“”,而不是“,,,”或重复项目。我忘了在boddy中添加。我想我只需要在这个答案中使用set()。apply(lambda x:“,”。join(set(x)))我找到了关于堆栈溢出的另一个主题讨论,我已将链接粘贴到我编辑的答案中。祝你好运!这很有魅力。我尝试了这个
.isnull()
,但我不知道我可以使用这个。any()
也不是astype()
(我正在用.dtype验证)…这套很好,避免了重复。谢谢
import numpy
df_new = df.replace(numpy.nan,' ', regex=True)
In [37]: df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': [1, None, 2, 4], 'c': ['foo', 'sho', 'sha', 'bar']})
In [43]: df
Out[43]:
a b c
0 1 1.0 foo
1 1 NaN foo
2 2 2.0 sha
3 2 4.0 bar
In [44]: df.b.groupby(df.a).apply(lambda x: '' if x.isnull().any() else ','.join(set(x.astype(str).values)))
Out[44]:
a
1
2 2.0,4.0
dtype: object
In [45]: df.c.groupby(df.a).apply(lambda x: '' if x.isnull().any() else ','.join(set(x.astype(str).values)))
Out[45]:
a
1 foo
2 sha,bar
dtype: object