根据多列处理数据

时间:2019-07-31 09:27:36

标签: python pandas

我的数据是这样的:

Unique_Number       information       complete_information 
    1                 Hello              Hello World 
    1                 Hello                 
    1                 Wrong Info      
    2                 R                  R, Python 
    2                
    3                 OverFlow           Stackoverflow 
    4                 Only info

我要实现的目标:

如果Unique_number相同(例如,全1,全2等),则应采用complete_information列的值,并将其粘贴到信息列中。 >

所需的输出:

Unique_Number       information       complete_information 
    1                 Hello World          Hello World 
    1                 Hello World                
    1                 Hello World      
    2                 R, Python            R, Python 
    2                 R, Python
    3                 Stackoverflow        Stackoverflow 
    4                 Only info

我无法为此找到一个合理的逻辑。我尝试遍历所有的Unique_Numbers,并粘贴complete_information值(如果Unique_Numbers相同),但是遇到了混乱的数据集。

2 个答案:

答案 0 :(得分:1)

您可以使用:

df.information=np.where(df.complete_information.notna(),df.complete_information,
                                                           df.information)
df.information=df.groupby('Unique_Number')['information'].transform('first')
print(df)

   Unique_Number    information complete_information
0              1    Hello World          Hello World
1              1    Hello World                 None
2              1    Hello World                 None
3              2      R, Python            R, Python
4              2      R, Python                 None
5              3  Stackoverflow        Stackoverflow
6              4      Only info                 None

,如果单元格是complete_information中的空白字符串,则可能要求将它们替换为np.nan),或将df.complete_information.notna()中的np.where(..)替换为{ {1}}

答案 1 :(得分:1)

使用基于 mask 的ob偏移了 的值(pandas.Series.shift):

In [723]: m = (df['Unique_Number'].shift(-1) == df['Unique_Number']) | (df['Unique_Number'] == df['Unique_Number'].shift(1))

In [724]: df.loc[m, 'information'] = df.loc[m, 'complete_information'].fillna(method='ffill')

In [725]: df
Out[725]: 
   Unique_Number  information complete_information
0              1  Hello World          Hello World
1              1  Hello World                 None
2              1  Hello World                 None
3              2    R, Python            R, Python
4              2    R, Python                 None
5              3     OverFlow        Stackoverflow
6              4    Only info                 None