Hyperplane
Hyperplane

Reputation: 1681

DataFrame with MultiIndex columns: set values of partial row via dictionary

from pandas import Index, MultiIndex, DataFrame, NA

columns = MultiIndex.from_product( (["foo", "bar"], list("abc"))   )
index = Index(range(10))
df = DataFrame(index=index, columns=columns, dtype="Float32")
    foo               bar            
      a     b     c     a     b     c
0  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
1  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
2  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
3  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
4  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
5  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
6  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
7  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
8  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
9  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>

How can I update the values in position [0, "foo"] with a dictionary foo_sample = {"b": 1.2, "c": 1.3, "a": 1.1}? I tried, using pandas 1.4.2:

df.loc[0, "foo"] = foo_sample        # does nothing.
df.loc[0, "foo"].update(foo_sample)  # does nothing
df.loc[0, "foo"].replace(foo_sample) # does nothing
df.loc[0, "foo"].map(foo_sample)     # replaces <NA> with NaN

Upvotes: 2

Views: 209

Answers (1)

Laurent
Laurent

Reputation: 13458

Here is one way to do it:

df.loc[0, ("foo", list(foo_sample.keys()))] = foo_sample.values()

print(df)
# Output
      a     b     c     a     b     c
0   1.1   1.2   1.3  <NA>  <NA>  <NA>
1  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
2  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
3  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
4  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
5  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
6  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
7  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
8  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
9  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>

See Advanced indexing with hierarchical index in Pandas documentation for additional guidance.

Upvotes: 2

Related Questions