Skip to content

Commit e31a1f0

Browse files
committed
WIP update upsert
1 parent 482232b commit e31a1f0

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

frame/davidkhala/data/frame/pandas/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import pandas as pd
22
def upsert(df, *primary_keys: str, record: dict):
33
index_keys = df.index.names if isinstance(df.index, pd.MultiIndex) else [df.index.name]
4-
condition = True
4+
condition = pd.Series(True, index=df.index)
5+
if df.columns.empty and df.index.empty:
6+
return pd.DataFrame([record])
57

68
for key in primary_keys:
79
if key in df.columns:
@@ -17,7 +19,5 @@ def upsert(df, *primary_keys: str, record: dict):
1719
for col, value in record.items():
1820
if col in df.columns:
1921
df.loc[match_indices, col] = value
20-
else:
21-
df = pd.concat([df, pd.DataFrame([record])], ignore_index=True)
22-
23-
return df
22+
return df
23+
return pd.concat([df, pd.DataFrame([record])])

frame/tests/pandas_test.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ def test_upsert(self):
3131
upsert(df, prim_key, record = new_record)
3232

3333
self.assertEqual(95, df.at[2, 'score'])
34+
def test_upsert_empty(self):
35+
df = pandas.DataFrame()
36+
prim_key = 'id'
37+
new_record = {'name': 'Charlie', 'score': 95, prim_key: 2}
38+
upsert(df, prim_key, record=new_record)
39+
40+
41+
df = pandas.DataFrame(columns=[prim_key]).set_index(prim_key)
42+
upsert(df, prim_key, record=new_record)
43+
3444
def test_upsert2(self):
3545
df = pandas.DataFrame([
3646
{'School': 'Oxford', 'Country': 'UK', 'Students': 1000},
@@ -40,6 +50,7 @@ def test_upsert2(self):
4050
record = {'School': 'Oxford', 'Country': 'UK', 'Students': new_students}
4151
df = upsert(df, 'School', 'Country', record=record)
4252
self.assertEqual(new_students, df.loc[('Oxford', 'UK')].Students)
53+
print(df)
4354
def test_upsert3(self):
4455
df = pandas.DataFrame([
4556
{'School': 'Oxford', 'Country': 'UK', 'Students': 1000},

0 commit comments

Comments
 (0)