使用groupby构造数据帧

如何解决使用groupby构造数据帧

我的数据框如下:

<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <div style="-webkit-column-count: 4;-moz-column-count: 4; column-count: 4;">
        <ul>
            <li>Gods</li>
            <li>Óðinn</li>
            <li>Baldur</li>
            <li>Njörður</li>
            <li>Freyr</li>
            <li>Týr</li>
            <li>Bragi</li>
            <li>Heimdal</li>
            <li>Thor</li>
            <li>Höðr</li>
            <li>Víðar</li>
            <li>Áli or Váli</li>
            <li>Ullr</li>
            <li>Forseti</li>
            <li>Óðinn</li>
            <li>Þór</li>
        </ul>
    </div>
</body>

</html>

我想用“目标”,“源”,“权重”列来写它,其中: “目标”和“来源”都是“ id”,“权重”取决于“目标”和“来源”同时更改价格的天数。看起来像这样:

                date    id     pct_change
12355258    2010-07-28  60059   0.210210
12355265    2010-07-28  60060   0.592000
12355282    2010-07-29  60059   0.300273
12355307    2010-07-29  60060   0.481982
12355330    2010-07-28  60076   0.400729

我的目标是使用此数据框制作一个networkx图。

我尝试使用groupby

target  source  weights
60059   60060   2
60059   60076   1   
60060   60076   1

和for循环(非常糟糕)。

我觉得我在小组赛中缺少一小步,但无法说出缺少的东西。

谢谢您的帮助。

解决方法

这个想法是,如果ID在每个日期都有一个pct_change,则首先使用pivto_table来获取True。

#first pivot to get True if any value of id for a date
df_ = df.pivot_table(index='id',columns='date',values='pct_change',aggfunc=any,fill_value=False)
print(df_)
date  2010-07-28 2010-07-29
id                         
60059       True       True
60060       True       True
60076       True      False

然后,您可以使用combination中的itertools创建所有可能的对,使用它们选择行,并使用&运算符来查看两者在同一日期具有True的地方,沿列求和(获取权重列)。将此列分配给从两个组合列表创建的数据框。

# get all combinations of ids
from itertools import combinations
a,b = map(list,zip(*combinations(df_.index,2)))

res = (pd.DataFrame({'target':a,'source':b})
         .assign(weigths=(df_.loc[a].to_numpy()
                          &df_.loc[b].to_numpy()
                         ).sum(axis=1))
      )
print(res)
   target  source  weigths
0   60059   60060        2
1   60059   60076        1
2   60060   60076        1

注意:不要忘记用您的分类列的名称更改index='id'中的pivot_table,否则您的计算机很可能无法处理以下操作和崩溃

,

尝试

import pandas as pd,numpy as np

ids = df.id.unique()
WeightDf = pd.DataFrame(index=ids,columns=ids)
WeightDf.loc[:,:] = 0

def weigh(ID):
    IdDates =  set(df.loc[df.id==ID].date.to_list())
    for i in ids:
        WeightDf.at[ID,i] = len(set.intersection(set(df.loc[df.id==i].date.to_list()),IdDates))
        
pd.Series(ids).apply(weigh)
print(WeightDf)

import itertools as itt
result = pd.DataFrame(columns=['Id1','Id2','Weight'])
for i1,i2 in itt.combinations(ids,2):
    result = pd.concat([result,pd.DataFrame(data=[{'Id1':i1,'Id2':i2,'Weight':WeightDf.loc[i1,i2]}])])

print(result)

,

看到了这个用例的很多变化-生成组合

import itertools

df = pd.read_csv(io.StringIO("""                date    id     pct_change
12355258    2010-07-28  60059   0.210210
12355265    2010-07-28  60060   0.592000
12355282    2010-07-29  60059   0.300273
12355307    2010-07-29  60060   0.481982
12355330    2010-07-28  60076   0.400729"""),sep="\s+")

# generate combinations of two... edge case when a group has only one member
# tuple of itself to itself
dfx = (df.groupby('date').agg({"id": lambda s: list(itertools.combinations(list(s),2))
                               if len(list(s))>1 else [tuple(list(s)*2)]})
    .explode("id")
     .groupby("id").agg({"id":"count"})
     .rename(columns={"id":"weights"})
     .reset_index()
     .assign(target=lambda dfa: dfa["id"].apply(lambda s: s[0]),source=lambda dfa: dfa["id"].apply(lambda s: s[1]))
     .drop(columns="id")
)

print(dfx.to_string(index=False))

输出

 weights  target  source
       2   60059   60060
       1   60059   60076
       1   60060   60076
,

This SO link最终为我的问题提供了更快的答案,该问题适用于大量id。它更接近我之前尝试使用的groupby + value_counts。

以下是代码,以方便将来的人们使用:

from itertools import combinations

def combine(batch):
    """Combine all products within one batch into pairs"""
    return pd.Series(list(combinations(set(batch),2)))

edges = df.groupby('date')['id'].apply(combine).value_counts()

c = ['source','target']
L = edges.index.values.tolist()
edges = pd.DataFrame(L,columns=c).join(edges.reset_index(drop=True))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-