合并 2 个熊猫字典列

时间:2021-05-10 12:06:14

标签: python pandas

我这里有一个简化为 3 列的数据框。

| id | channels | facebookCount |
|:---- |:------:| -----:|
| 0  | {'channel': 'Google', 'count': 0.0}    | 3 |
| 1  | {'channel': 'Google', 'count': 4.0}    | 0 |
| 2  | {'channel': 'Google', 'count': 3.0}    | 6 |

channels 列是一个简单的计数列,如 facebookCount。但是,我使用 applylambda 将其转换为字典:

        data_df["channels"] = data_df["googleCount"].apply(
           lambda x: {} if x is None else {"channel": "Google", "count": x})

如何构建频道列,以便它同时包含 facebook 和 google 的数据,以便我有一个包含 2 个字典的列表,如下所示:

| id | channels |
|:---- |:------:|
| 0   | [{'channel': 'Google', 'count': 0.0}, {'channel': 'Facebook', 'count': 3.0}] |
| 1   | [{'channel': 'Google', 'count': 4.0}, {'channel': 'Facebook', 'count': 0.0}] |
| 2   | [{'channel': 'Google', 'count': 3.0}, {'channel': 'Facebook', 'count': 6.0}] |

我尝试创建两个字典,然后设置通道以及创建一个字典,然后使用 apply 和 lambda 以及一个辅助函数合并这两个字典

dict1 = data_df["30DayGoogleCampaignCount"].apply(
    lambda x: {"channel": "Google", "count": x})

data_df["paidMediaChannels"] = data_df["30DayFacebookCampaignCount"].apply(
    lambda x: self.Merge(dict1, {"channel": "facebook", "count": x}))


   def Merge(self, dict1, dict2):
        return(dict2.update(dict1))

1 个答案:

答案 0 :(得分:1)

尝试类似:

import pandas as pd

df = pd.DataFrame({'id': [0, 1, 2],
                   'channels': [{'channel': 'Google', 'count': 0.0},
                                {'channel': 'Google', 'count': 4.0},
                                {'channel': 'Google', 'count': 3.0}],
                   'facebookCount': [3, 0, 6]})

# Create List
df['channels'] = df.apply(
    lambda x: [x['channels'],
               {'channel': 'Facebook',
                'count': x['facebookCount']}],
    axis=1
)
# Drop facebookCount Column
df = df.drop(columns='facebookCount')

print(df.to_string())

df

   id                                                                    channels
0   0  [{'channel': 'Google', 'count': 0.0}, {'channel': 'Facebook', 'count': 3}]
1   1  [{'channel': 'Google', 'count': 4.0}, {'channel': 'Facebook', 'count': 0}]
2   2  [{'channel': 'Google', 'count': 3.0}, {'channel': 'Facebook', 'count': 6}]