在pandas dataframe中合并两列,将NaN值填充为前一个值。
在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的逻辑。
合并两列,使用前一个值填充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”填充。
合并两列的原因是想要将数据框中的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)