![](/img/trans.png)
[英]Assign values to columns in Pandas Dataframe based on data from another dataframe
[英]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
有没有办法在不循环的情况下做到这一点? 请注意,两个数据帧的索引是不同的。
您可以尝试使用dict
并assign
:
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
本例中的x
是main_df
和df
之间的列差
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.