Pandas:根据布尔列表/字典

时间:2017-02-23 15:39:03

标签: python pandas

我有两个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

我做了一些分析,发现我想要替换列BD。我可以像这样循环:

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合并功能有更好的方法吗?

2 个答案:

答案 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']]