Pandas Concat列中groupby之后的字符串,忽略NaN,忽略重复项

2024-04-20 04:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

根据查询的不同,我的DF可以有一个带字符串的列或一个带有NaN的列。在

例如:

  ID     grams   Projects
0  891            4.0      NaN
1  725            9.0      NaN

或者

^{pr2}$

我可以处理其中的一个,但是当我试图创建一个通用的函数时,我失败得很惨。我需要忽略末尾的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

另外,“Projects”列的结果不应允许重复。某些按ID分组的行具有重要信息,这些信息将被求和(“grams”),但“External_ID”不应出现多次。 例如:

  ID       grams      External_Id
0  890        1.0      P1
1  890        1.0      P2
2  890        1.0      P2
3  724        1.0      P1
4  724        1.0      P1

结果应该是

  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

Tags: lambdaiddfisnanexternalprojectswhen
2条回答

我认为这应该有助于:

import numpy
df_new = df.replace(numpy.nan,' ', regex=True)

编辑:

我认为这个solution可能对你有用(只是作为@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或{}应用相同的函数,处理nan和重复项:

^{pr2}$

相关问题 更多 >