当行是NaN时获取pandas标头

Sar*_*rit 2 python nan pandas

我从传感器获取数据.有些时候他们blank string无缘无故地回到我身边!

在数据清理期间.我可以设法NaN使用它来获取列

df[df.isnull().values.any(axis=1)]

    Time    IL1 IL2 IL3 IN  kVA kW  kWh
12463   2018-09-17 10:30:00 63.7    78.4    53.3    25.2    NaN NaN 2039676.0
12464   2018-09-17 11:00:00 64.1    78.6    53.5    25.4    NaN NaN 2039698.0
Run Code Online (Sandbox Code Playgroud)

我怎么能kVA and kW离开DataFrame
然后,我能找到mediankVA and KW与其他行并更换NaN

我的用例:
现在我必须读取文件并找到NaN列的位置.这需要我的努力.所以我想通过替换列名上的硬编码来自动化该过程.

trdb_a2_2018_df = pd.read_csv(PATH + 'dpm_trdb_a2_2018.csv', thousands=',', parse_dates=['Time'], date_parser=extract_dt)
trdb_a2_2018_df = trdb_a2_2018_df.replace(r'\s+', np.nan, regex=True)
median_kVA = trdb_a2_2018_df['kVA'].median()
trdb_a2_2018_df = trdb_a2_2018_df['kVA'].fillna(median_kVA)
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

我相信你需要fillnamedian:

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,5,4,5,5,np.nan],
         'C':[7,np.nan,9,4,2,3],
         'D':[1,3,5,7,1,0],
         'E':[5,3,6,9,2,4],
         'F':list('aaabbb')
})

print (df)
   A    B    C  D  E  F
0  a  4.0  7.0  1  5  a
1  b  5.0  NaN  3  3  a
2  c  4.0  9.0  5  6  a
3  d  5.0  4.0  7  9  b
4  e  5.0  2.0  1  2  b
5  f  NaN  3.0  0  4  b

df1 = df.fillna(df.median())
print (df1)
   A    B    C  D  E  F
0  a  4.0  7.0  1  5  a
1  b  5.0  4.0  3  3  a
2  c  4.0  9.0  5  6  a
3  d  5.0  4.0  7  9  b
4  e  5.0  2.0  1  2  b
5  f  5.0  3.0  0  4  b
Run Code Online (Sandbox Code Playgroud)

如果想NaN在列中也适合:

m = df.isnull().any()
df.loc[:, m] = df.loc[:, m].fillna(df.loc[:, m].median())
Run Code Online (Sandbox Code Playgroud)

替代方案:

cols = df.columns[df.isnull().any()]
df[cols] = df[cols].fillna(df[cols].median())
Run Code Online (Sandbox Code Playgroud)

细节:

print (df.median())
B    5.0
C    4.0
D    2.0
E    4.5
dtype: float64
Run Code Online (Sandbox Code Playgroud)