Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 基于值和NaN合并行_Python_Pandas_Dataframe - Fatal编程技术网

Python 基于值和NaN合并行

Python 基于值和NaN合并行,python,pandas,dataframe,Python,Pandas,Dataframe,我的数据框如下所示: ID VALUE1 VALUE2 VALUE3 1 NaN [ab,c] Good 1 google [ab,c] Good 2 NaN [ab,c1] NaN 2 First [ab,c1] Good1 2 First [ab,c1] 3 NaN [ab,c] Good 要求是: 身份证是关键。对于ID 2,我有3行。因此,我需要将两行合并为一行,这样所有列都有有效值(不包括nul

我的数据框如下所示:

ID  VALUE1  VALUE2  VALUE3
1   NaN     [ab,c]  Good
1   google  [ab,c]  Good
2   NaN     [ab,c1] NaN
2   First   [ab,c1] Good1
2   First   [ab,c1]  
3   NaN     [ab,c]  Good        
要求是: 身份证是关键。对于ID 2,我有3行。因此,我需要将两行合并为一行,这样所有列都有有效值(不包括null和空格)

我的预期产出是:

ID  VALUE1  VALUE2  VALUE3
1   google      [ab,c]  Good
2   First       [ab,c1] Good1
3   NaN     [ab,c]  Good        
我们是否有任何pandas功能来实现这一点,或者我是否必须将数据分离为两个或多个数据帧,并基于NaN/空间进行合并?
谢谢你的帮助

注意,我投资了谷歌

import pandas as pd
import numpy as np

data = {'ID' : [1,1,2,2,2,3], 'VALUE1':['NaN','Google','NaN', 'First', 'First','NaN'], 'VALUE2':['abc', 'abc', 'abc1', 'abc1', 'abc1', 'abc'], 'VALUE3': ['Good', 'Good', 'NaN', 'Good1', '0', 'Good']}        
df = pd.DataFrame(data)
df_ = df.replace('NaN', np.NaN).fillna('zero', inplace=False)
df2 = df_.sort_values(['VALUE1', 'ID'])
mask = df2.ID.duplicated()
print (df_[~mask])
输出

   ID  VALUE1 VALUE2 VALUE3
1   1  Google    abc   Good
3   2   First   abc1  Good1
5   3    zero    abc   Good

最后,请注意遮罩中的tilda字符(~)是必不可少的

Micheal G有一个更优雅的解决方案。 以下是我比较耗时和业余的方法:

import pandas as pd
import numpy as np
df = pd.DataFrame({"ID": [1,1,2,2,2,3],
        "V1": [np.nan,'google',np.nan,'First','First',np.nan],
        "V2": [['ab','c'],['ab','c'],['ab','c1'],['ab','c1'],['ab','c1'],['ab','c']],
        "V3": ['Good','Good',np.nan,np.nan,'Good1','Good']
    })
应返回:

       V1        V2     V3
1  google   [ab, c]   Good
2   First  [ab, c1]  Good1
3     NaN   [ab, c]   Good

为什么
NaN[ab,c]在输出中是好的
?它与谷歌行中的“Good”和[ab,c]匹配。你能解释一下你想做什么吗?不清楚是要从每个
VALUE1
组中提取第一个元素,还是随机提取一个元素。。。目前,
df.groupby('VALUE1')。first()
将是一个有效的解决方案。我已经添加了详细信息。
df.groupby('ID')。first()
?它可行,只需一分钟。我没有将“[]”放入数据帧,因为这在python中意味着其他内容。空值可以出现在任何列中。可以是值2、值3。另外,我的原始数据框形状是(109444,9)。在本例中,只需使用fillna,我已将NaN改为“零”尝试:数据={'ID':[1,1,2,2,2,2,3],'VALUE1':[np.NaN,'Google',np.NaN,'First',First',np NaN],'VALUE2':['abc',np NaN',abc1',abc1',abc'],'VALUE3':['Good',Good',np NaN',Good1',0',Good']}df pd.dataframe(数据框)df2=df.sort\u values('VALUE1')。sort\u values('ID')。fillna('zero',inplace=True)mask=df2.ID.duplicated()print(df[~mask])AttributeError:'NoneType'对象也没有属性'ID'用于数据={ID':[1,1,2,2,2,2,2,3],'VALUE1':[np NaN,'Google'np'NaN,'First','First','First',np NaN,'VALUE2':['abc','np NaN abc1','abc1','abc1','abc1','abc1','ab['Good','Good',np.NaN,'Good1','0','Good']}df=pd.DataFrame(数据)。预期输出为:`ID VALUE1 VALUE2 VALUE3 1谷歌abc Good 2 First abc1 Good 1 3 zero abc Good`。但ID1创新解决方案的列VALUE1为零。+1我获得的输出为`VALUE1 VALUE2 VALUE3 1 NaN abc Good`,但预期为:`VALUE1 VALUE2 VALUE3 1谷歌abc Good`。使用的输入:数据={'ID':[1,1,2,2,2,3],'VALUE1':[np.NaN,'Google',np.NaN,'First','First',np.NaN],'VALUE2':['abc',np.NaN,'abc1','abc1','abc'],'VALUE3':['Good','np NaN Good1','0','Good']}df w=pd.DataFrame(数据)嘿,玛丹,我误解了你的问题。对不起,你在熊猫身上描述的内容是不可能的,除非你把每个单元格都当作一个列表。例如:数据={'ID':[1,1,1,2,2,2,3],'VALUE1':['Amazon',np.NaN','Google',np.NaN','First',np NaN','VALUE2':[np NaN abc1','abc1','abc1','abc1','abc','abc','VALUE3':[np.NaN,'Good','Good',np.NaN,'Good1','0','Good']}df=pd.DataFrame(数据)ID 1的输出(如果将每个单元格视为列表)将是:VALUE1 VALUE2 VALUE3['Amazon','Google],abc,Good。如果您仍然需要帮助,请告诉我,我可以更改上述代码段。
       V1        V2     V3
1  google   [ab, c]   Good
2   First  [ab, c1]  Good1
3     NaN   [ab, c]   Good