Tuyên bố vấn đề:
một chuỗi cột khung dữ liệu gấu trúc,cùng_nhóm
Cần phải dựa trên hai cột hiện có hàng ngang
Và col
Giá trị được tạo từ giá trị bool. Nếu hai giá trị có trong từ điển tư cách thành viên
Nếu có các giá trị tương tự (giá trị giao nhau) trong hàng thì hàng đó cần hiển thị True, nếu không thì là Sai (không có giá trị giao nhau). sử dụng pd.apply()
đưa ra lỗi:
TypeError: ('checkGrouping() nhận 2 đối số vị trí nhưng 3 đối số đã được đưa ra', 'xảy ra ở hàng chỉ mục')
cài đặt:
nhập gấu trúc dưới dạng pd
nhập numpy dưới dạng np
n = np.nan
tư cách thành viên = {'a':['nguyên âm'], 'b':['phụ âm'], 'c':['phụ âm'], 'd':['phụ âm'], 'e':['nguyên âm '], 'y':['phụ âm', 'nguyên âm']}
đồng dư = pd.DataFrame.from_dict(
{'hàng': ['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('hàng')
congruent.columns.names = ['col']
cs = congruent.stack().to_frame()
cs.columns = ['điểm']
cs.reset_index(inplace=True)
cs.head(6)
Mục tiêu mong muốn:
Tạo chuỗi bool:
Hãy thử 0:
def checkGrouping(row, col):
nếu hàng trong member.keys() và col trong member.keys():
trả về tư cách thành viên[row].intersection(set(memberships[col]))
khác:
trở về np.nan
cs['same_group'] = cs.apply(checkGrouping,args=(cs['row'], cs['col']))
Có vẻ như tôi đang hướng tới kiểm traNhóm
cung cấp args Vậy tại sao tôi lại gặp phải lỗi này và cách khắc phục?
# tạo một chuỗi để thuận tiện cho việc lập bản đồ
# biến mỗi thành viên thành một tập hợp để tôi có thể giao nhau sau này
lkp = pd.Series(thành viên).apply(set)
#lấy số hàng và cột
# ánh xạ các tập hợp tới các chỉ số cột và hàng
n, m = đồng dư.hình dạng
c = congruent.columns.to_series().map(lkp).values
r = congruent.index.to_series().map(lkp).values
in(c)
[{'nguyên âm'} {'phụ âm'} {'phụ âm'} {'phụ âm'} {'nguyên âm'}
{'phụ âm', 'nguyên âm'}]
in(r)
[{'nguyên âm'} {'phụ âm'} {'phụ âm'} {'phụ âm'} {'nguyên âm'}
{'phụ âm', 'nguyên âm'}]
# sử dụng np.repeat, np.tile, zip để tạo tích Descartes
# cái này phải khớp với chỉ mục sau khi xếp chồng
# áp dụng giao điểm tập hợp cho mỗi cặp
# tập trống là Sai, ngược lại là Đúng
giống nhau = [
bool(set.intersection(*tup))
cho tup trong zip(np.repeat(r, m), np.tile(c, n))
]
# sử dụng dropna=False để đảm bảo chúng tôi duy trì
#cartesianproductTôi đã mong đợi
# sau đó cắt bằng danh sách boolean tôi đã tạo
#anddropna
congruent.stack(dropna=False)[same].dropna()
hàng cột
ae 0,80
năm 0,01
trước Công nguyên 0,50
d 0,70
năm 0,01
cb 0,50
d 0,30
năm 0,01
db 0,70
c0,30
năm 0,01
ea 0,80
năm 0,01
ừ 0,01
b 0,01
c0,01
d 0,01
e 0,01
dtype: float64
tạo ra kết quả mong muốn
congruent.stack(dropna=False).reset_index(name='Score') \
.sign(same_group=np.array(same).astype(int)).dropna()
Tôi là một lập trình viên xuất sắc, rất giỏi!