Python Pandas 将一列中的 NaN 替换为第二列对应行的值
Posted
技术标签:
【中文标题】Python Pandas 将一列中的 NaN 替换为第二列对应行的值【英文标题】:Python Pandas replace NaN in one column with value from corresponding row of second column 【发布时间】:2015-05-24 12:14:08 【问题描述】:我正在 Python 中使用这个 Pandas DataFrame。
File heat Farheit Temp_Rating
1 YesQ 75 N/A
1 NoR 115 N/A
1 YesA 63 N/A
1 NoT 83 41
1 NoY 100 80
1 YesZ 56 12
2 YesQ 111 N/A
2 NoR 60 N/A
2 YesA 19 N/A
2 NoT 106 77
2 NoY 45 21
2 YesZ 40 54
3 YesQ 84 N/A
3 NoR 67 N/A
3 YesA 94 N/A
3 NoT 68 39
3 NoY 63 46
3 YesZ 34 81
我需要将 Temp_Rating
列中的所有 NaN 替换为 Farheit
列中的值。
这是我需要的:
File heat Temp_Rating
1 YesQ 75
1 NoR 115
1 YesA 63
1 YesQ 41
1 NoR 80
1 YesA 12
2 YesQ 111
2 NoR 60
2 YesA 19
2 NoT 77
2 NoY 21
2 YesZ 54
3 YesQ 84
3 NoR 67
3 YesA 94
3 NoT 39
3 NoY 46
3 YesZ 81
如果我进行布尔选择,我一次只能选择其中一列。问题是,如果我随后尝试加入他们,我将无法在保持正确顺序的同时做到这一点。
我怎样才能只找到带有NaN
s 的Temp_Rating
行并将它们替换为Farheit
列的同一行中的值?
【问题讨论】:
【参考方案1】:假设你的 DataFrame 在df
:
df.Temp_Rating.fillna(df.Farheit, inplace=True)
del df['Farheit']
df.columns = 'File heat Observations'.split()
首先将任何NaN
值替换为df.Farheit
的对应值。删除'Farheit'
列。然后重命名列。这是生成的DataFrame
:
【讨论】:
如果两列数据类型都是对象,而不是 N/A,它是该行中的空单元格,如何处理? 一种可能的考虑方法:您可以先将空字符串替换为NaN
(参见here),然后使用this 方法。
答案是完美的。如果您想更多地使用 pandas 语法,我建议您删除 df.drop("Farheit", axis=1)
的列,但这可能是个人喜好
@MichaelA 同意 drop
现在在 Pandas-land 中优先于 del
。如果使用最近的 Pandas,建议使用 df = df.drop(columns='Farheit')
而非数字轴编号。【参考方案2】:
上述解决方案对我不起作用。我使用的方法是:
df.loc[df['foo'].isnull(),'foo'] = df['bar']
【讨论】:
它是引发异常还是根本不起作用?尝试 isna() 而不是 isnull()。【参考方案3】:解决这个问题的另一种方法,
import pandas as pd
import numpy as np
ts_df = pd.DataFrame([[1,"YesQ",75,],[1,"NoR",115,],[1,"NoT",63,13],[2,"YesT",43,71]],columns=['File','heat','Farheit','Temp'])
def fx(x):
if np.isnan(x['Temp']):
return x['Farheit']
else:
return x['Temp']
print(1,ts_df)
ts_df['Temp']=ts_df.apply(lambda x : fx(x),axis=1)
print(2,ts_df)
返回:
(1, File heat Farheit Temp
0 1 YesQ 75 NaN
1 1 NoR 115 NaN
2 1 NoT 63 13.0
3 2 YesT 43 71.0)
(2, File heat Farheit Temp
0 1 YesQ 75 75.0
1 1 NoR 115 115.0
2 1 NoT 63 13.0
3 2 YesT 43 71.0)
【讨论】:
【参考方案4】:@Jonathan 的回答很好,但是有点矫枉过正,就用pop
:
df['Temp_Rating'] = df['Temp_Rating'].fillna(df.pop('Farheit'))
【讨论】:
【参考方案5】:接受的答案使用fillna()
,它将填充两个数据框共享索引的缺失值。正如here 很好解释的那样,对于两个数据帧的索引不匹配的情况,您可以使用combine_first
来填充缺失值、行和索引值。
df.Col1 = df.Col1.fillna(df.Col2) #fill in missing values if indices match
#or
df.Col1 = df.Col1.combine_first(df.Col2) #fill in values, rows, and indices
【讨论】:
不错的答案。在这里的问题中,我没想到数据中有不重叠的索引,所以.filna()
就足够了。实际上,这里的重点是单个列 (Temp_Rating
),其中 NaN
s 出现在数据中,因此这两种方法 - .fillna()
和 combine_first()
- 最终产生了等效的输出。尽管如此,这是一种非常有用的方法。以上是关于Python Pandas 将一列中的 NaN 替换为第二列对应行的值的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas根据多个其他列中的条件替换一列中的值[重复]
在 Pandas 中处理 Nulls – 在一列中使用过滤值来填充另外两列中的 nan
pandas:用列中的最后一个非 NaN 值替换 NaN [重复]
Pandas:根据另一列的键在现有列上映射字典值以替换 NaN