我有一些分组表格数据,并在此数据有针对每个数据点其实可以有一组不同的值的列。 我试图计算出一套不同于差异组在其前面的数据点的它的一员。 例如,下面给出的数据,我试图计算的值的差Tokens
†为Timestep
从的值值n Tokens
用于与所述行Timestamp
值n - 1为每个Dyad,Participant
组合:
| Dyad | Participant | Timestep | Tokens |
|------|-------------|----------|-------------------|
| 1 | A | 1 | apple,banana |
| 1 | B | 1 | apple,orange |
| 1 | A | 2 | banana |
| 1 | B | 2 | orange,kumquat |
| 1 | A | 3 | orange |
| 1 | B | 3 | orange,pear |
| 2 | A | 1 | orange,pear |
| 2 | B | 1 | apple,banana,pear |
| 2 | A | 2 | banana,persimmon |
| 2 | B | 2 | apple |
| 2 | A | 3 | banana |
| 2 | B | 3 | apple |
我怎样才能最好地实现这一点使用熊猫吗?
预期结果
我最终要创建具有函数的输出的新列token_overlap(data)
,其计算的比率Token
,随着数据点其之前的值重叠值:
| Dyad | Participant | Timestep | Tokens | TokenOverlap |
|------|-------------|----------|-------------------| -------------|
| 1 | A | 1 | apple,banana | (no value) |
| 1 | B | 1 | apple,orange | (no value) |
| 1 | A | 2 | banana | 0.5 |
| 1 | B | 2 | orange,kumquat | 0.333 |
| 1 | A | 3 | orange | 0 |
| 1 | B | 3 | orange,pear | 0.333 |
| 2 | A | 1 | orange,pear | (no value) |
| 2 | B | 1 | apple,banana,pear | (no value) |
| 2 | A | 2 | banana,persimmon | 0 |
| 2 | B | 2 | apple | 0.333 |
| 2 | A | 3 | banana | 0.5 |
| 2 | B | 3 | apple | 1 |
目前的做法
我转换的多值成frozenset
使用converters
的关键字pandas.read_csv(...)
def parse_set(cell_value: str) -> FrozenSet[str]:
return frozenset(cell_value.split(','))
round_tokens = pandas.read_csv(inpath, converters={"Tokens": parse_set})
然后,我创建的群组Dyad,Participant
使用数据点pandas.DataFrame.groupby(..)
round_tokens.sort_values(["Dyad", "Timestep"])
dyad_participants = round_tokens.groupby(["Dyad", "Participant"])
不过,我不确定如何让每一行,它的precedessor的Tokens
值(这应该是一个frozenset
):我有一个试图做这样一些功能,但我不能确定的功能本身就是错误的,或者如果我提取行数据不正确。
def token_overlap(data):
own_relevant_tokens = data["Tokens"]
prev_tokens = data.shift(-1)["Tokens"]
overlap = own_relevant_tokens.intersection(prev_tokens)
union = own_relevant_tokens.union(prev_tokens)
return len(overlap) / len(union)
round_tokens["TokenOverlap"] = dyad_participants.apply(token_overlap)
然而,这并不实际工作:实际误差
AttributeError的:“系列”对象有没有属性“联盟”
但我知道我不使用/理解/正确所著的Grokking大熊猫API,因此非常啰嗦的问题。 我怎么能组我的数据,然后,每个组内,计算从一行它前面的行度量使用设置样的价值观和同一列的值?
†在真实数据,有超过1,000个可能的值, Tokens
,所以,至少对我来说,如果我列举每个令牌布尔值,例如存在这个任务会更难Token_Apple
, Token_Banana
等。