我有两个pandas数据框,我想合并在一起,但不是我在我能够找到的例子中看到的方式。我有一套#34; old"数据和一组新的"两个数据框的形状相同,具有相同列名的数据。我做了一些分析并确定我需要创建第三个数据集,从" old"中获取一些列。数据和一些来自" new"数据。举个例子,假设我有这两个数据集:
df_old = pd.DataFrame(np.zeros([5,5]),columns=list('ABCDE'))
df_new = pd.DataFrame(np.ones([5,5]),columns=list('ABCDE'))
简单地说:
A B C D E
0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0 0.0
和
A B C D E
0 1.0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0 1.0
我做了一些分析,发现我想要替换列B
和D
。我可以像这样循环:
replace = dict(A=False,B=True,C=False,D=True,E=False)
df = pd.DataFrame({})
for k,v in sorted(replace.items()):
df[k] = df_new[k] if v else df_old[k]
这给了我想要的数据:
A B C D E
0 0.0 1.0 0.0 1.0 0.0
1 0.0 1.0 0.0 1.0 0.0
2 0.0 1.0 0.0 1.0 0.0
3 0.0 1.0 0.0 1.0 0.0
4 0.0 1.0 0.0 1.0 0.0
但是,老实说这看起来有点笨拙,我想象有一种更好的方法来使用熊猫这样做。另外,我想保留我的列的顺序,这可能不是像这个示例数据集那样按字母顺序排列,因此排序字典可能不是可行的方法,尽管我可能从数据中提取列名称如果需要,设置。
使用一些Pandas合并功能有更好的方法吗?
答案 0 :(得分:2)
一个非常基本的方法就是过滤布尔字典然后直接分配。
var whereClause = "";
if (User.Roll = "Student")
{
whereClause = "WHERE USER_NAME = '" + User.Name + "'";
}
sqlQuery = "SELECT .... " + whereClause;
如果您想保留旧的DataFrame,可以使用assign()
to_rep = [k for k in replace if replace[k]]
df_old[to_rep] = df_new[to_rep]
正如Nickil所提到的那样,df_old.assign(**{k: df_new[k] for k in replace if replace[k]})
显然没有保留论点顺序,因为我们正在通过一个字典。但是,为了可预测,它会在DataFrame的末尾按字母顺序插入指定的列。
<强>演示强>
assign()
答案 1 :(得分:0)
只需指定所需的新列:
df_old['B'] = df_new['B']
df_old['D'] = df_new['D']
或者作为一行:
df_changes = df_old.copy()
df_changes[['B', 'D']] = df_new[['B', 'D']]