Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 3.x 合并具有相同值的行和具有多个空值的相同索引_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

Python 3.x 合并具有相同值的行和具有多个空值的相同索引

Python 3.x 合并具有相同值的行和具有多个空值的相同索引,python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我是熊猫的新手。我正在尝试和答案所说的一样的事情 我有这样的数据 SubjectID Visit Value1 Value2 Value3 1 1.57 1.75 1.56 1 1.56 N/A N/A B1 2 N/A 1.56 N/A 我想要像这样的数据

我是熊猫的新手。我正在尝试和答案所说的一样的事情

我有这样的数据

SubjectID       Visit    Value1    Value2    Value3
                 1         1.57      1.75     1.56   
                 1         1.56       N/A     N/A 
    B1           2         N/A       1.56     N/A
我想要像这样的数据

SubjectID       Visit    Value1    Value2    Value3
                 1     1.57,1.56      1.75     1.56    
    B1           2         N/A       1.56     N/A  
我试过的是

#1. Did not work    
df.groupby(['SubjectID', 'Visit'])['Value1']\
  .apply(lambda val: ','.join(val)).reset_index()

#2. did not work
df = df.groupby(['SubjectID', 'Visit'])['Value1']\
       .apply(lambda val: ','.join(val)).reset_index() 

#3. did not work
df.groupby(['SubjectID', 'Visit'])['Value1', 'Value2', 'Value3']\
  .apply(lambda v1, v2, v3 : ','.join(val1), ','.join(val2), ','.join(val3)).reset_index()

#4. did not work
df.groupby(['SubjectID', 'Visit'])\
       ['Value1'].apply(lambda v1:','.join(val1)) \
       ['Value2'].apply(lambda v2:','.join(val2)) \
       ['Value3'].apply(lambda v3:','.join(val3)).reset_index()
有什么建议可以让它正常工作吗?

与自定义lambda函数一起使用,通过和转换为字符串删除缺少的值,如果所有值都缺少,则返回
np.nan

f = lambda val: np.nan if val.isna().all() else ','.join(val.dropna().astype(str))
df = df.groupby(['SubjectID', 'Visit']).agg(f).reset_index()
print (df)
  SubjectID  Visit     Value1  Value2  Value3
0                1  1.57,1.56    1.75    1.56
1        B1      2        NaN    1.56     NaN
如果需要空字符串而不是缺少值,则解决方案更简单:

f = lambda val: ','.join(val.dropna().astype(str))
df1 = df.groupby(['SubjectID', 'Visit']).agg(f).reset_index()
print (df1)
  SubjectID  Visit     Value1  Value2 Value3
0                1  1.57,1.56    1.75   1.56
1        B1      2               1.56       

使用groupby并连接来自同一组的值:

(
    df.fillna('')
    .astype(str).groupby(by=['SubjectID', 'Visit'])
    .agg(lambda x: ','.join(x.loc[x!='']))
    .reset_index()
)

    SubjectID   Visit   Value1      Value2  Value3
0               1       1.57,1.56   1.75    1.56
1   B1          1                   1.56    

我还希望在Value2和Value3列上使用相同的值,是否要添加多个
agg
?请explain@KishorPawar-是,或者如果需要处理未在
groupby
中指定的所有列,如
['SubjectID','Visit']
仅删除
groupby
之后的列,如果需要选择多个列,请使用
df.groupby(['SubjectID','Visit'])['Value1','Value2','Value3']
上述操作无效,你能提出更多建议吗?@KishorPawar-你能说得更具体一点吗
上面没有起作用
?它没有对
df
进行任何更改,我没有合并。我不想只按
SubjectID
进行分组。