用字典列表覆盖数据框
Over writing a dataframe with a list of dicts
假设一个字典像
rows = [{"A":1, "B":2},{"A":2, "B":2},{"A":3, "B":2}]
数据框 df
可能包含也可能不包含 A
和 B
列,在任何一种情况下我都想连接或更新其相应的值。
我的解决方案是:
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
假设一个字典像
rows = [{"A":1, "B":2},{"A":2, "B":2},{"A":3, "B":2}]
数据框 df
可能包含也可能不包含 A
和 B
列,在任何一种情况下我都想连接或更新其相应的值。
我的解决方案是:
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