用字典列表覆盖数据框

Over writing a dataframe with a list of dicts

假设一个字典像

rows = [{"A":1, "B":2},{"A":2, "B":2},{"A":3, "B":2}]

数据框 df 可能包含也可能不包含 AB 列,在任何一种情况下我都想连接或更新其相应的值。

我的解决方案是:

data = rows[0]

for key,val in data.items():
    if key in df:
       df.drop(key, axis=1)

df2 = pd.DataFrame(rows)
df = pd.concat([df, df2], axis=1)

我想知道是否正确和安全,或者是否有更好的方法。

假设df是:

   A  C
   10 4
   10 4
   10 4

rows 更新后应该是:

   A   B   C
   1   2   4
   2   2   4
   3   2   4

换句话说,数据框被新值覆盖。也许 combine 函数有用,但是它需要一个函数。

您是否正在尝试合并 2 个 DataFrame 以填充缺失的列?

df1 = pd.DataFrame([{"A":1, "B":2},{"A":3, "B":2},{"A":4, "B":3}])
dfA = df1.drop("B", axis=1)

print(pd.concat([df1, dfA], axis=1))
   A  B  A
0  1  2  1
1  3  2  3
2  4  3  4

print(pd.merge(df1, dfA, on="A", how="left"))
   A  B
0  1  2
1  3  2
2  4  3

编辑: 所以您希望用新数据框中的新列更新旧数据框。这是一个可能的解决方案:

我定义了一个函数来接收新旧数据帧。然后我检查旧数据框中存在的新列并删除它们,以便这些新列可以连接到其余列。

import pandas as pd

def update_dataframe(old_df, new_df):
    for col in new_df.columns:
        if col in old_df.columns:  #drop the old column
            old_df = old_df.drop(col, axis=1)
    return pd.concat([new_df, old_df], axis=1)

df = pd.DataFrame([{"A":10, "C":4},{"A":10, "C":4},{"A":10, "C":4}])
df2 = pd.DataFrame([{"A":1, "B":2},{"A":2, "B":2},{"A":3, "B":2}])
result = update_dataframe(df, df2)
print(result)

输出

   A  B  C
0  1  2  4
1  2  2  4
2  3  2  4

Eidt2: 是的,您也可以使用 .update().merge() 方法。这种方式更简洁,将方法包含在新函数 update_dataframe2:

def update_dataframe2(old_df, new_df):
    old_df.update(new_df)
    return new_df.merge(old_df)

df = pd.DataFrame([{"A":10, "C":4},{"A":10, "C":4},{"A":10, "C":4}])
df2 = pd.DataFrame([{"A":1, "B":2},{"A":2, "B":2},{"A":3, "B":2}])
result = update_dataframe2(df, df2)
print(result)

输出同上

   A  B  C
0  1  2  4
1  2  2  4
2  3  2  4

要更新 pandas 数据框,您可以使用 append 方法。 例如, 数据框 df 需要更新。

rows=([{'A':5,},{'A':0,'B':9},{'A':7,'B':25}]
df=pd.DataFrame(rows)

new_rows=[{"A":1, "B":2},{"A":3, "B":2},{"A":4, "B":3}]

df.append(new_rows,ignore_index=True) # ignore index to reset the numbering