繁体   English   中英

根据另一个数据帧将列添加到 Pandas 数据帧并将值设置为零

[英]Add columns to Pandas dataframe based on another dataframe and set values to zero

我有两个 Pandas 数据框,如下所示:

import pandas as pd
main_df = pd.DataFrame({
    'day1': [1, 2, 3, 4],
    'day2': [2, 1, 3, 4],
    'day3': [3, 1, 2, 5],
    'day4': [2, 1, 3, 5],
    'day5': [4, 1, 2, 3],
    'day6': [5, 3, 4, 2]}, index=['a', 'b', 'c', 'd'])

df = pd.DataFrame({
    'day1': [0, 1, 0],
    'day3': [0, 0, 1]
})

我想将 main_df 中的列添加到 df 并将它们的值设置为 0。我的预期输出是:

df
    day1  day2  day3  day4  day5 day6
0    0      0    0      0    0     0
1    1      0    0      0    0     0
2    0      0    1      0    0     0

我可以通过以下方式循环执行此操作:

cols_to_add = main_df.columns[~main_df.columns.isin(df.columns)]
for c in cols_to_add:
    df[c] = 0

有没有办法在不循环的情况下做到这一点? 请注意,两个数据帧的索引是不同的。

您可以尝试使用dictassign

cols_to_add = main_df.columns[~main_df.columns.isin(df.columns)]
d = dict.fromkeys(cols_to_add, 0)
df.assign(**d)

或者

pd.concat([df, pd.DataFrame(columns = cols_to_add)]).fillna(0)

   day1     day3    day2    day4    day5    day6
0   0       0       0       0       0       0
1   1       0       0       0       0       0
2   0       1       0       0       0       0

请使用df.reindex(columns=[x])join结局df

本例中的xmain_dfdf之间的列差

df.join(df.reindex(columns=list(main_df.columns.difference(df.columns)))).fillna(0)

  day1     day3    day2    day4    day5    day6
0   0       0       0       0       0       0
1   1       0       0       0       0       0
2   0       1       0       0       0       0

你可以做

df[cols_to_add] = pd.DataFrame(columns=cols_to_add, index=df.index).fillna(0)

DataFrame 切片接受兼容的 DataFrame 作为值

你可以试试这个:

import pandas as pd
import numpy as np

# 1 - List comprehension
col_to_add = [col for col in main_df.columns if col not in df.columns]
# 2 - Create values to add using pd.DataFrame constructor and numpy
zero_vals_df = pd.DataFrame(data=np.zeros((3,len(col_to_add)),dtype=int),columns=col_to_add,index=df.index)
# 3 - Join DataFrames to obtain the desired result
df = pd.concat([df,zero_vals_df],axis=1)

在我的机器上,使用%%timeit magic cell 我得到了以下性能:

每个循环 429 µs ± 3.37 µs(平均值 ± 标准偏差,7 次运行,每次 1000 次循环)

请注意,此方法需要您添加numpy作为依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM