如何从 Python 中的 DataFrame 的每一行中提取多个值?
How do I extract multiple values from each row of a DataFrame in Python?
我有一个包含列 currencies
和 c_codes
的 DataFrame df2
。
currencies
列中的每一行都是一个或多个词典的列表。我想在 currencies
的每一行的每个列表中的每个字典中提取键 code
的值,并将 code
值传输到 DataFrame c_codes
的不同列
例证:
来自 df2['currencies'][0]
我想提取 code
值 AFN
并将其传输到 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'}]]})
我有一个包含列 currencies
和 c_codes
的 DataFrame df2
。
currencies
列中的每一行都是一个或多个词典的列表。我想在 currencies
的每一行的每个列表中的每个字典中提取键 code
的值,并将 code
值传输到 DataFrame c_codes
的不同列
例证:
来自 df2['currencies'][0]
我想提取 code
值 AFN
并将其传输到 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'}]]})