我有一个看起来像这样的数据框:
var row = '<div class="card mb-3"><a class="card link-unstyled" onclick="openOrder("' + data[i].order_id + '")" 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
,如果它为空,则向索引添加一个,然后搜索相应的值,但是不确定这是否是最佳方法。
答案 0 :(得分:2)
pandas
具有内置功能,可以使用另一列替换原始文档中的NA
值:
df[2018] = df[2018].combine_first(df[3])
如果您有许多这样的列,请考虑如何遍历这些列以使用列名及其右边的名称。 (或者我可以帮助您)
答案 1 :(得分:1)
想法是用前向填充misisng值替换几年至几年的下一个值,然后将DataFrame.groupby
与axis=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)
但是它需要一些编辑。