如果列名称== Year并且值为NaN pandas,则将数据框中的值向左移动

时间:2019-11-28 12:36:33

标签: python pandas dataframe nan

我有一个看起来像这样的数据框:

var row = '<div class="card mb-3"><a class="card link-unstyled" onclick="openOrder(&quot;' + data[i].order_id + '&quot;)" data-toggle="modal" data-target="#orderModal">

我想得到一个看起来像这样的数据框:

                              0    1   2018       3   2017       5
0                    Population    3    NaN  418980    NaN  501433
1                       British    4  31514     NaN  96797     NaN
2                        French  NaN   3089     NaN    201     NaN
3                           NaN  NaN  34603     NaN  96998     NaN

其中的逻辑是: 如果年份列具有NaN值,请在右侧查找数值并替换NaN值。

我认为我需要找到任何年份列的索引,寻找 0 1 2018 3 2017 5 0 Population 3 418980 NaN 501433 NaN 1 British 4 31514 NaN 96797 NaN 2 French NaN 3089 NaN 201 NaN 3 NaN NaN 34603 NaN 96998 NaN ,如果它为空,则向索引添加一个,然后搜索相应的值,但是不确定这是否是最佳方法。

3 个答案:

答案 0 :(得分:2)

pandas具有内置功能,可以使用另一列替换原始文档中的NA值:

df[2018] = df[2018].combine_first(df[3])

如果您有许多这样的列,请考虑如何遍历这些列以使用列名及其右边的名称。 (或者我可以帮助您)

答案 1 :(得分:1)

想法是用前向填充misisng值替换几年至几年的下一个值,然后将DataFrame.groupbyaxis=1一起用于每列的分组,并获得第一个非缺失值(如果存在GroupBy.first

s = df.columns.astype(str).to_series()
a = s.where(s.str.contains('\d{4}')).ffill().fillna(s)
print (a)
0          0
1          1
2018    2018
3       2018
2017    2017
5       2017
dtype: object

df1 = df.groupby(pd.Index(a), axis=1).first()
print (df1)
         0     1         2017      2018
0  Population   3.0  501433.0  418980.0
1     British   4.0   96797.0   31514.0
2      French   NaN     201.0    3089.0
3         NaN   NaN   96998.0   34603.0

答案 2 :(得分:0)

通过使用@Aryerez回答的问题,我想到了:

columns_list = list(df.columns) 
year_column_indexes = [i for i, item in enumerate(columns_list) if re.search('201[0-9]', item)]
for _index in year_column_indexes:
    df.iloc[:, _index] = df.iloc[:, _index].combine_first(df.iloc[:, _index+1])
    df = df.drop(df.columns[_index+1], axis=1)

但是它需要一些编辑。