如何在 python 中展平数据 numpy.ndarray
How to flatten data numpy.ndarray in python
我有一个如下所示的 numpy.ndarray 数据,我想将其展平以便我可以对其进行操作。请在下面找到我的示例数据:
sample_data=[list([{'region': 'urn:li:region:9194', 'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}}, {'region': 'urn:li:region:7127', 'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}])]
我已尝试使用以下代码,但还没有成功:
sample.flatter()
期望的输出如下:
region organicFollowerCount paidFollowerCount
urn:li:region:9194 157 0
urn:li:region:7127 17 0
有人能帮我实现这个吗?
您将无法使用 Numpy 的扁平化方法按照您想要的方式扁平化此数据。该方法仅采用 multi-dimensional ndarray 并将其展平为一维。您可以阅读文档 here.
其他几件事。首先,上面的示例数据不是 ndarray,它只是一个 python 列表。实际上,由于您在方括号内调用 list()
,因此它是一个嵌套的字典列表。这确实不是存储此信息的好方法,并且基于这种复杂的格式,您几乎没有选择可以很好地将其“扁平化”为您想要的 table。
如果您有很多这样的行,我会执行以下操作:
headers = ["region", "organicFollowerCount", "paidFollowerCount"]
data = [headers]
for row in sample_data[0]: # Subindexing here because it is unwisely a nested list
formatted_row = []
formatted_row.append(row["region"])
formatted_row.append(row["followerCounts"]["organicFollowerCount"])
formatted_row.append(row["followerCounts"]["paidFollowerCount"]
data.append(formatted_row)
data = np.array(data)
这将为您提供一个 ndarray 数据,就像您在这里拥有的那样,但这仍然是一个丑陋的解决方案。实际上,这是一种非常不切实际的数据呈现方式,您应该放弃它以获得更好的方式。
最后一件事:不要使用驼峰式大小写。这是某些语言的标准做法,例如 Java 但不是 Python。而不是 organicFollowerCount
使用 organic_follower_count
等等。
这是一种使用 pd.json_normalize
:
的方法
import pandas as pd
# note that `sample data` has been modified into a list of dictionaries
sample_data = [
{'region': 'urn:li:region:9194',
'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}},
{'region': 'urn:li:region:7127',
'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}
]
现在,将列表中的每一项转换为数据框:
dfs = list()
# convert one dict at a time into a data frame, using json_normalize()
for sd in sample_data:
t = pd.json_normalize(sd)
dfs.append(t)
# convert list of dataframes into a single data frame,
# and change column labels
t = pd.concat(dfs).rename(columns={
'followerCounts.organicFollowerCount': 'organicFollowerCount',
'followerCounts.paidFollowerCount': 'paidFollowerCount'
}).set_index('region')
print(t)
organicFollowerCount paidFollowerCount
region
urn:li:region:9194 157 0
urn:li:region:7127 17 0
正如@thehumaneraser 指出的那样,这种格式并不理想,但我们不能总是影响我们接收到的数据的格式。
我有一个如下所示的 numpy.ndarray 数据,我想将其展平以便我可以对其进行操作。请在下面找到我的示例数据:
sample_data=[list([{'region': 'urn:li:region:9194', 'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}}, {'region': 'urn:li:region:7127', 'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}])]
我已尝试使用以下代码,但还没有成功:
sample.flatter()
期望的输出如下:
region organicFollowerCount paidFollowerCount
urn:li:region:9194 157 0
urn:li:region:7127 17 0
有人能帮我实现这个吗?
您将无法使用 Numpy 的扁平化方法按照您想要的方式扁平化此数据。该方法仅采用 multi-dimensional ndarray 并将其展平为一维。您可以阅读文档 here.
其他几件事。首先,上面的示例数据不是 ndarray,它只是一个 python 列表。实际上,由于您在方括号内调用 list()
,因此它是一个嵌套的字典列表。这确实不是存储此信息的好方法,并且基于这种复杂的格式,您几乎没有选择可以很好地将其“扁平化”为您想要的 table。
如果您有很多这样的行,我会执行以下操作:
headers = ["region", "organicFollowerCount", "paidFollowerCount"]
data = [headers]
for row in sample_data[0]: # Subindexing here because it is unwisely a nested list
formatted_row = []
formatted_row.append(row["region"])
formatted_row.append(row["followerCounts"]["organicFollowerCount"])
formatted_row.append(row["followerCounts"]["paidFollowerCount"]
data.append(formatted_row)
data = np.array(data)
这将为您提供一个 ndarray 数据,就像您在这里拥有的那样,但这仍然是一个丑陋的解决方案。实际上,这是一种非常不切实际的数据呈现方式,您应该放弃它以获得更好的方式。
最后一件事:不要使用驼峰式大小写。这是某些语言的标准做法,例如 Java 但不是 Python。而不是 organicFollowerCount
使用 organic_follower_count
等等。
这是一种使用 pd.json_normalize
:
import pandas as pd
# note that `sample data` has been modified into a list of dictionaries
sample_data = [
{'region': 'urn:li:region:9194',
'followerCounts': {'organicFollowerCount': 157, 'paidFollowerCount': 0}},
{'region': 'urn:li:region:7127',
'followerCounts': {'organicFollowerCount': 17, 'paidFollowerCount': 0}}
]
现在,将列表中的每一项转换为数据框:
dfs = list()
# convert one dict at a time into a data frame, using json_normalize()
for sd in sample_data:
t = pd.json_normalize(sd)
dfs.append(t)
# convert list of dataframes into a single data frame,
# and change column labels
t = pd.concat(dfs).rename(columns={
'followerCounts.organicFollowerCount': 'organicFollowerCount',
'followerCounts.paidFollowerCount': 'paidFollowerCount'
}).set_index('region')
print(t)
organicFollowerCount paidFollowerCount
region
urn:li:region:9194 157 0
urn:li:region:7127 17 0
正如@thehumaneraser 指出的那样,这种格式并不理想,但我们不能总是影响我们接收到的数据的格式。