如何从 Python 中的 DataFrame 的每一行中提取多个值?

How do I extract multiple values from each row of a DataFrame in Python?

我有一个包含列 currenciesc_codes 的 DataFrame df2

currencies 列中的每一行都是一个或多个词典的列表。我想在 currencies 的每一行的每个列表中的每个字典中提取键 code 的值,并将 code 值传输到 DataFrame c_codes 的不同列

例证:

来自 df2['currencies'][0] 我想提取 codeAFN 并将其传输到 df2['c_codes'][0]

类似地,如果一行有多个 code 值,例如 df2['currencies'][8] 那么我想提取一个 code 值的列表 ['AUD','GBP'] 并传输列表到 df2['c_codes][8]

c_codes 中的每个条目都可以是用于此目的的列表。

这是我的代码:

我试过使用循环来获取每个字典中的 code 值。在每一行中并将它们附加到列表 temp。然后将列表 temp 附加到更大的列表 list_of_currencies 这样我就得到了一个列表,其中包含与每一行对应的代码列表。然后我清除 temp 列表,这样它就可以抓取 code 的下一行,依此类推。

然而,代码returns list_of_currencies 为空。我试过循环、temp、列表等,但它只是 returns 空列表,或者是所有附加的 codes 没有子列表的列表。

我想要一个包含 codes 子列表的列表,这样我就可以将每个子列表分配给 c_codes 列中的相应行。

我做错了什么?有更简单的方法吗?

如果我理解正确,下面是我将如何解决你的问题:

import pandas

df = pandas.DataFrame({
    "x": ["A", "B", "C"],
    "currencies": [[{"code": "x"}, {"code": "y"}], [{"code": "u"}], [{"code": "v"}]]
})
print(df)
>    x                      currencies
  0  A  [{'code': 'x'}, {'code': 'y'}]
  1  B                 [{'code': 'u'}]
  2  C                 [{'code': 'v'}]


df["c_codes"] = df["currencies"].apply(lambda x: [i["code"] for i in x])
print(df)
>    x                      currencies c_codes
  0  A  [{'code': 'x'}, {'code': 'y'}]  [x, y]
  1  B                 [{'code': 'u'}]     [u]
  2  C                 [{'code': 'v'}]     [v]

apply 方法的作用是迭代 currencies 中的值并将 lambda 函数应用于它:对于每个输入(在本例中为字典列表)return 每个 code 值的列表。然后将这些结果保存到新列 c_codes.

我认为您可以使用 explode 扩展对象列表,并使用 .str 获取 code 值,以获得矢量化(阅读:非常快)解决方案:

df['c_codes'] = df['currencies'].explode().str['code'].groupby(level=0).agg(list).str.join(', ')

输出(基于此答案底部的示例数据):

>>> df
                                                                                 currencies   c_codes
0                                               [{'code': 'AFN', 'name': 'Afghan afghani'}]       AFN
1                                                         [{'code': 'EUR', 'name': 'Euro'}]       EUR
2  [{'code': 'AUD', 'name': 'Australian dollar'}, {'code': 'GBP', 'name': 'British pound'}]  AUD, GBP
3                                        [{'code': 'XCD', 'name': 'East Carribean dollar'}]       XCD

如果您想要 c_codes 列中的实际列表而不仅仅是 comma-separate 字符串,只需省略 .str.join 部分:

df['c_codes'] = df['currencies'].explode().str['code'].groupby(level=0).agg(list)

输出:

>>> df
                                                                                 currencies     c_codes
0                                               [{'code': 'AFN', 'name': 'Afghan afghani'}]       [AFN]
1                                                         [{'code': 'EUR', 'name': 'Euro'}]       [EUR]
2  [{'code': 'AUD', 'name': 'Australian dollar'}, {'code': 'GBP', 'name': 'British pound'}]  [AUD, GBP]
3                                        [{'code': 'XCD', 'name': 'East Carribean dollar'}]       [XCD]

用于测试上述代码的示例数据:

df = pd.DataFrame({'currencies': [
    [{'code':'AFN','name':'Afghan afghani'}],
    [{'code':'EUR','name':'Euro'}],
    [{'code':'AUD','name':'Australian dollar'},{'code':'GBP','name':'British pound'}],
    [{'code':'XCD','name':'East Carribean dollar'}]]})