类型错误:位置参数Pandas。申请

2024-10-04 05:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

问题陈述:

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

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

设置:

^{pr2}$

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

生成布尔级数:

尝试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提供参数,那么为什么我会得到这个错误,以及如何修复它?在


Tags: intruepandasindexreturn错误groupcol
2条回答

apply将沿着它迭代的列或行传递给您。因此,您的函数checkGrouping将接收该参数。所以正确的原型应该是:

def checkGrouping(s, row, col):
    if row in memberships.keys() and col in memberships.keys():
        return memberships[row].intersection(set(memberships[col]))
    else:
        return np.nan
# 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

^{pr2}$
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

相关问题 更多 >