在pandas dataframe中合并两列,将NaN值填充为前一个值。

13 浏览
0 Comments

在pandas dataframe中合并两列,将NaN值填充为前一个值。

我有一个数据框:\n

         State                           RegionName
0      Alabama                              Alabama
1          NaN                               Auburn
2          NaN                             Florence
3          NaN                         Jacksonville
4          NaN                           Livingston
5          NaN                           Montevallo
6          NaN                                 Troy
7          NaN                           Tuscaloosa
8          NaN                             Tuskegee
9       Alaska                               Alaska
10         NaN                            Fairbanks
11     Arizona                              Arizona
12         NaN                            Flagstaff
13         NaN                                Tempe
14         NaN                               Tucson

\n我该如何返回\n

DataFrame([["Alabama", "Auburn"], 
           ["Alabama", "Florence"], .
            .., 
           ["Alaska", "Fairbanks"],  
           ["Arizona", "Flagstaff"],  
           ...], columns=["State", "RegionName"])

\n以便所有的值都能很好地合并?\n我尝试过:df[\'State\'] = df[\'State\'].apply(lambda x: df[\'RegionName\']),但它缺少在开始新的RegionName时分配新State的逻辑。

0
0 Comments

合并两列,使用前一个值填充NaN。

问题的原因:在给定的数据帧中,有两列“State”和“RegionName”。其中,第二列“RegionName”中出现了NaN值,需要将其填充为前一个非NaN值。

解决方法:使用pandas的fillna函数,并设置method参数为'ffill',即使用前一个非NaN值填充。

代码如下:

import pandas as pd
import numpy as np
df = pd.DataFrame([["Alabama", "Auburn"],
                   [np.nan, "Florence"],
                   [np.nan, "Fairbanks"],
                   ["Arizona", "Flagstaff"]], columns=["State", "RegionName"])
df.fillna(method='ffill')

输出结果:

     State RegionName
0  Alabama     Auburn
1  Alabama   Florence
2  Alabama  Fairbanks
3  Arizona  Flagstaff

通过使用fillna函数,我们成功将NaN值填充为前一个非NaN值。这样,在第二列中的NaN值被前一个非NaN值“Alabama”填充。

0
0 Comments

合并两列的原因是想要将数据框中的NaN值填充为前一个值。解决方法是使用pandas的ffill函数。下面是解决问题的代码和结果:

df['State'] = df['State'].ffill()
print(df)

      State    RegionName
0   Alabama       Alabama
1   Alabama        Auburn
2   Alabama      Florence
3   Alabama  Jacksonville
4   Alabama    Livingston
5   Alabama    Montevallo
6   Alabama          Troy
7   Alabama    Tuscaloosa
8   Alabama      Tuskegee
9    Alaska        Alaska
10   Alaska     Fairbanks
11  Arizona       Arizona
12  Arizona     Flagstaff
13  Arizona         Tempe
14  Arizona        Tucson

这个问题的答案看起来非常简单,很可能之前已经有人问过类似的问题。因此,我们应该找到重复的问题而不是重新回答它。以下是找到重复问题的代码和讨论:

lst = list()
for i in df.iterrows():
    if i[1][0] != i[1][1]:
        lst.append(i[1])
newdf = pd.DataFrame(lst)

然而,这个解决方案存在一个问题,就是df1的索引中有一些间隙,因为已经删除了一些项。通过重置df1的索引来解决这个问题,可以使用reset_index函数并设置参数drop为True:

df1 = df[df['State'] != df['RegionName']].reset_index(drop=True)

0