使用Pandas将列复制到数据帧的多个列

2024-10-03 04:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多列的数据框架,有几列是NaN。dataframe相当大,大约有5000列。以下是其中的一个示例:

    GeoCode     ESP     FIN     USA     EZ19    PRT      
1   Geography   Spain   Finland USA     EZ      Portugal
2   31-Mar-15   NaN     NaN     0.26    0.89    NaN
3   30-Jun-15   NaN     NaN     NaN     0.90    NaN
4   30-Sep-15   NaN     NaN     0.31    0.90    NaN
5   31-Dec-15   NaN     NaN     0.41    0.91    NaN

我想将列“EZ19”的值复制到所有列,其中第2行及以下的所有值都是NaN。我尝试了以下代码,它可以工作:

nan_cols = df.columns[df_macro[2:].isnull().all()].to_list()
for c in nan_cols:
   df.loc[2:,c]= df.loc[2:,'EZ19']

但我认为应该有一种方法可以在不使用循环的情况下将列“EZ19”的值分配给目标列,而且我很惊讶,似乎没有一种直接的方法来实现这一点。这里的其他问题似乎无法解决我遇到的问题,也找不到适合我的解决方案

考虑到我的数据帧的大小(预计随着时间的推移,它会越来越大),我真的希望避免在我的最终代码中使用循环,因此对此的任何帮助都将不胜感激


Tags: 数据方法代码框架示例dataframedfnan
3条回答

用EZ19中的值替换行中所有空值的简单oneliner:

df = df.apply(lambda row: row.where(pd.notnull(row), row.EZ19), axis=1)

输出:

    GeoCode     ESP     FIN     USA     EZ19    PRT
0   Geography   Spain   Finland USA     EZ      Portugal
1   31-Mar-15   0.89    0.89    0.26    0.89    0.89
2   30-Jun-15   0.90    0.90    0.90    0.90    0.90
3   30-Sep-15   0.90    0.90    0.31    0.90    0.90
4   31-Dec-15   0.91    0.91    0.41    0.91    0.91

不确定这是否是您的想法:

outcome = df.loc[2:, df.loc[2:].isna().all()].mask(
    lambda df: df.isna(), df.loc[2:, "EZ19"], axis=0
)

outcome

    ESP     FIN     PRT
2   0.89    0.89    0.89
3   0.90    0.90    0.90
4   0.90    0.90    0.90
5   0.91    0.91    0.91

df.update(outcome)

df

    GeoCode     ESP     FIN     USA     EZ19    PRT
1   Geography   Spain   Finland USA     EZ  Portugal
2   31-Mar-15   0.89    0.89    0.26    0.89    0.89
3   30-Jun-15   0.90    0.90    NaN     0.90    0.90
4   30-Sep-15   0.90    0.90    0.31    0.90    0.90
5   31-Dec-15   0.91    0.91    0.41    0.91    0.91

仅从第2行向下填充完全空的行USA从第2行开始不是完全空的,这就是它没有被更改的原因

如果您对替换包含所有空值的列的值感兴趣,您可以使用快捷方式,在确定第2行下面的所有值完全为空后,只需覆盖这些值

# Identify columns that contain null values from row 2 onwards
all_null_cols = df.loc[2:].isnull().all()

# overwrite row 2 onwards in only our null columns with values from "EZ19"
df.loc[2:, all_nulls] = df.loc[2:, ["EZ19"]].values

print(df)
     GeoCode    ESP      FIN   USA  EZ19       PRT
1  Geography  Spain  Finland   USA    EZ  Portugal
2  31-Mar-15   0.89     0.89  0.26  0.89      0.89
3  30-Jun-15   0.90     0.90   NaN  0.90      0.90
4  30-Sep-15   0.90     0.90  0.31  0.90      0.90
5  31-Dec-15   0.91     0.91  0.41  0.91      0.91

相关问题 更多 >