列表中的项目数量(来自 pandas 列)由于未知原因而增加?

Number of items in list (from pandas column) increasing for unknown reason?

我正在通过在线笔记本工作: https://medium.com/@anateresa.mdneto/starbucks-capstone-project-79f84b2a1558

和我运行陷入了一个问题。暂时不重要。

在我苦苦思索之后,我决定'start from square one'尝试解决它。​​

起点:transcript.shape --> (306534, 4) 注意行数,306534.

  1. df中有一列dicts。我想找出有多少个唯一键以及每个键出现了多少次。注意:有四个键 - 但是 - 除了拼写错误外,其中两个键实际上是相同的。所以我最终想以三个结束。

我首先提取该列并将其转换为字典,因此我只使用 python。我还仔细检查了 len 以确保没有发生任何愚蠢的事情。

TEMP = transcript['value'].to_dict()
print(len(TEMP))  # 306534   <-- So far no surprises.
  1. TEMP 是一个字典的字典,其中键是索引,值是我真正想要的字典。所以我将这些值提取到一个列表中:
dkeys = [v for k, v in TEMP.items()]
print(len(dkeys))  # 306534   <-- Still no surprises.

完整性检查:

pprint(dkeys[:10])
[{'offer id': '9b98b8c7a33c4b65b9aebfe6a799e6d9'},
 {'offer id': '0b1e1539f2cc45b7b9fa7c272da2e1d7'},
 {'offer id': '2906b810c7d4411798c6938adc9daaa5'},
 {'offer id': 'fafdcd668e3743c1bb461111dcafc2a4'},
 {'offer id': '4d5c57ea9a6940dd891ad53e9dbe8da0'},
 {'offer id': 'f19421c1d4aa40978ebb69ca19b0e20d'},
 {'offer id': '2298d6c36e964ae4a3e7e9706d1fb8c2'},
 {'offer id': '3f207df678b143eea3cee63160fa8bed'},
 {'offer id': '0b1e1539f2cc45b7b9fa7c272da2e1d7'},
 {'offer id': '0b1e1539f2cc45b7b9fa7c272da2e1d7'}]
  1. 这里是车轮从马车上脱落的地方。现在我从字典中提取键来计算它们。我还投了一个集合来获得唯一值。
total_keys = [k for d in dkeys for k in d]
print(len(total_keys))
print(Counter(total_keys))
unique_keys = set([k for d in dkeys for k in d])
print(unique_keys)
340113
Counter({'amount': 138953, 'offer id': 134002, 'offer_id': 33579, 'reward': 33579})
{'offer id', 'amount', 'reward', 'offer_id'}

什么?! 340113?那是怎么发生的?我的计数增加了 33579。巧合的是我的两个计数 在上面的计数器中是相同的值吗?不知何故我对此表示怀疑。

我missing\doing哪里错了?我所做的只是提取密钥并计算它们。为什么项目总数在增加?

从文章中的链接下载代码后,我加载文件:

file1 = "e:\python\pandas\datasets\Starbucks\portfolio.json"
portfolio = pd.read_json(file1, orient='records', lines=True)

file2 = "e:\python\pandas\datasets\Starbucks\profile.json"
profile = pd.read_json(file2, orient='records', lines=True)

file3 = "e:\python\pandas\datasets\Starbucks\transcript.json"
transcript = pd.read_json(file3, orient='records', lines=True)

答案很简单:你们不是在比较同一件事

在初始情况下,您计算 dictionaries/rows 的数量:

dkeys = list(transcript['value'])
len(dkeys)
# 306534

(注意。我借此机会简化了您不必要的复杂代码)

然后你计算所有词典中的累计项目数。

total_keys = [k for d in dkeys for k in d]
len(total_keys)
# 340113

有些词典只有一个以上的键,而您 flatten/count 可以理解列表中的键。

[d for d in dkeys if len(d)>1]

[{'offer_id': '2906b810c7d4411798c6938adc9daaa5', 'reward': 2},
 {'offer_id': 'fafdcd668e3743c1bb461111dcafc2a4', 'reward': 2},
 {'offer_id': '9b98b8c7a33c4b65b9aebfe6a799e6d9', 'reward': 5},
 ...
]

我double-checked,你有33579本词典,有2个键,其他的都有一个唯一键。 306534+33579 = 340113: 都算上了!