1

我有一个看起来像这样但有 20 列的 pandas df。我想编写一个循环遍历所有列并将它们标准化。我很难理解循环。

b = json_data
b1 = pd.json_normalize(b['financial'])

for column in b1:
    pd.json_normalize(b1[column])
    print()

这就是循环或函数将执行的操作,而无需编写 20 行相同的代码和 n+1 的索引。

b1a = pd.json_normalize(b1[0])
b1b = pd.json_normalize(b1[1])
b1c = pd.json_normalize(b1[2])
0 1 2
{'type.coding': [{'code': 'https://bluebutton.... {'type.coding': [{'code': 'https://bluebutton.... {'type.coding': [{'code': 'https://bluebutton....

预期的输出是这样的:

类型编码 usedMoney.currency usedMoney.value
[{'code':'https://bluebutton.... [{'code': 'https://bluebutton.... [{'code': 'https://bluebutton....
4

1 回答 1

0

听起来您希望从数据框中的每个展平列中收集单个数据框b1?像这样:

flattened_column_dfs = []
for column in b1:
    flattened_column_dfs.append(pd.json_normalize(b1[column]))

然后,您将每个数据框作为 flattened_column_dfs 中的一个项目,其中列表的索引对应于列。您可以在列表上循环并将每个作为数据框访问以进一步处理或使用。
或访问特定的。
示例:flattened_column_dfs[0] 对应第一列,flattened_column_dfs[1] 对应第二列,以此类推。

如果您更喜欢以原始列的位置作为键的字典:

flattened_column_dfs_as_dictionary = {}
for indx, column in enumerate(b1):
    flattened_column_dfs_as_dictionary[indx] = pd.json_normalize(b1[column])

由于您的列名b1似乎已经是零索引位置的整数,您可以将该字典缩短为:

flattened_column_dfs_as_dictionary = {}
for column in b1:
    flattened_column_dfs_as_dictionary[column] = pd.json_normalize(b1[column])

字典提供了更多用于迭代和访问单个键和关联值的选项。


如果您愿意,可以使用字母作为字典的键。这不太方便,除非您在第一个 26 之后添加交替增量,例如AA第 27 和AB第 28 等,否则您被限制为 26。幸运的是,这里有代码可以做到这一点,其中key 整数为零是列Aflattened_column_dfs_as_dictionary这是使用上面的代码以整数作为键的事后执行该操作的方法:

import string

def n2a(n,b=string.ascii_uppercase):
   d, m = divmod(n,len(b))
   return n2a(d-1,b)+b[m] if d else b[m]

flattened_column_dfs_as_dictionary = {n2a(k):v for k,v in flattened_column_dfs_as_dictionary.items()}

当然,您可以n2a在最初为字典制作键时使用相同的功能来执行此操作。

于 2022-02-23T03:08:17.773 回答