gpt4 book ai didi

python - 类型错误 : Positional Arguments with pandas. 适用

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:43 26 4
gpt4 key购买 nike

问题陈述:

一个 pandas dataframe 列系列,same_group 需要根据两个现有列 rowcol 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似值(相交值),则该行需要显示 True,否则为 False(没有相交值)。使用 pd.apply() 给出错误:

TypeError: ('checkGrouping() takes 2 positional arguments but 3 were given', 'occurred at index row')

设置:

import pandas as pd
import numpy as np
n = np.nan
memberships = {'a':['vowel'], 'b':['consonant'], 'c':['consonant'], 'd':['consonant'], 'e':['vowel'], 'y':['consonant', 'vowel']}

congruent = pd.DataFrame.from_dict(
{'row': ['a','b','c','d','e','y'],
'a': [ n, -.8,-.6,-.3, .8, .01],
'b': [-.8, n, .5, .7,-.9, .01],
'c': [-.6, .5, n, .3, .1, .01],
'd': [-.3, .7, .3, n, .2, .01],
'e': [ .8,-.9, .1, .2, n, .01],
'y': [ .01, .01, .01, .01, .01, n],
}).set_index('row')
congruent.columns.names = ['col']

snippet of dataframe cs

cs = congruent.stack().to_frame()
cs.columns = ['score']
cs.reset_index(inplace=True)
cs.head(6)

snippet of dataframe cs stacked

期望的目标:

finest drawing of added pandas column

制作 bool 系列:

尝试0:

def checkGrouping(row, col):
if row in memberships.keys() and col in memberships.keys():
return memberships[row].intersection(set(memberships[col]))
else:
return np.nan


cs['same_group'] = cs.apply(checkGrouping,args=(cs['row'], cs['col']))

看起来我正在向 checkGrouping 提供 args 那么为什么我会收到此错误以及如何修复它?

最佳答案

# create a series to make it convenient to map
# make each member a set so I can intersect later
lkp = pd.Series(memberships).apply(set)

# get number of rows and columns
# map the sets to column and row indices
n, m = congruent.shape
c = congruent.columns.to_series().map(lkp).values
r = congruent.index.to_series().map(lkp).values

print(c)
[{'vowel'} {'consonant'} {'consonant'} {'consonant'} {'vowel'}
{'consonant', 'vowel'}]

print(r)
[{'vowel'} {'consonant'} {'consonant'} {'consonant'} {'vowel'}
{'consonant', 'vowel'}]

# use np.repeat, np.tile, zip to create cartesian product
# this should match index after stacking
# apply set intersection for each pair
# empty sets are False, otherwise True
same = [
bool(set.intersection(*tup))
for tup in zip(np.repeat(r, m), np.tile(c, n))
]

# use dropna=False to ensure we maintain the
# cartesian product I was expecting
# then slice with boolean list I created
# and dropna
congruent.stack(dropna=False)[same].dropna()

row col
a e 0.80
y 0.01
b c 0.50
d 0.70
y 0.01
c b 0.50
d 0.30
y 0.01
d b 0.70
c 0.30
y 0.01
e a 0.80
y 0.01
y a 0.01
b 0.01
c 0.01
d 0.01
e 0.01
dtype: float64

产生想要的结果

congruent.stack(dropna=False).reset_index(name='Score') \
.assign(same_group=np.array(same).astype(int)).dropna()

enter image description here

关于python - 类型错误 : Positional Arguments with pandas. 适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41620262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com