Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-列中groupby之后的Concat字符串,忽略NaN,忽略重复项_Python_Python 3.x_Pandas_Nan_Missing Data - Fatal编程技术网

Python Pandas-列中groupby之后的Concat字符串,忽略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

根据查询的不同,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 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