首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫数据检索

熊猫数据检索
EN

Stack Overflow用户
提问于 2022-05-11 10:09:12
回答 2查看 57关注 0票数 0

使用以下csv文件

代码语言:javascript
复制
id,name,cy,in
0,MD,4,16
2,MD,10,20
3,YD,5,14
4,ZD,10,14

我编写了以下代码来创建一个新的dataframe。

代码语言:javascript
复制
df = pd.read_csv('test.csv', usecols=['id', 'name', 'cy', 'in'])
df2 = pd.DataFrame(columns=['N', 'I', 'C'])
ids=[0,2,4]
for i in ids:
    row = df.loc[df['id'] == i]
    cyc = row.at[row.index[0],'cy']
    ins = row.at[row.index[0],'in']
    name = row.at[row.index[0],'name']
    if df2['N'].str.contains(name):
        print("Matched")
    else:
    new_row = {'N':name, 'I':ins, 'C':cyc}
    df_temp = pd.DataFrame([new_row])
    df2 = pd.concat([df2, df_temp], axis=0, ignore_index=True)
print(df2)

如您所见,对于指定的id,我首先从原始的dataframe,df获得行。如果我无法在第二个dataframe中找到namedf2,那么创建一个新行并将其添加到第二个dataframe中。但是,在匹配时,我想将值添加到现有的行中。所以,最后,我希望看到:

代码语言:javascript
复制
    N   I   C
0  MD  36  14
2  ZD  14  10

但是,该if语句有以下错误:

代码语言:javascript
复制
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我能修好吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-11 10:14:01

使用Series.isin获取boolean indexing中的所有id,然后在名称聚合中聚合sum

代码语言:javascript
复制
ids=[0,2,4]

df = (df[df['id'].isin(ids)].groupby('name', as_index=False)
                            .agg(I=('in','sum'), C=('cy','sum'))
                            .rename(columns={'name':'N'}))
print (df)
    N   I   C
0  MD  36  14
1  ZD  14  10
票数 1
EN

Stack Overflow用户

发布于 2022-05-11 10:16:31

您可以使用isin,然后使用groupby和命名聚合

代码语言:javascript
复制
out = df[df['id'].isin(ids)].groupby('name').agg(I=('in', sum),
                                                 C=('cy', sum)).reset_index().rename(columns={'name': 'N'})
代码语言:javascript
复制
print(out)

    N   I   C
0  MD  36  14
1  ZD  14  10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72199192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档