小编Bru*_*llo的帖子

Pandas groupby 获取最小的字符串

我有以下数据框:

df = pd.DataFrame({'id': 3*['a']+4*['b'], 'name':['al', 'qwer', 'l', 'ewdbd', 'op', 'qsde', 'knmkln']})
Run Code Online (Sandbox Code Playgroud)
id    name
 a      al
 a    qwer
 a       l
 b   ewdbd
 b      op
 b    qsde
 b  knmkln
Run Code Online (Sandbox Code Playgroud)

我想按 id 进行分组并获取名称中最短的字符串,如果有多个具有最小长度的字符串,则它可以是任何字符串,最终的数据帧将是:

id    name
a      l
b      op
Run Code Online (Sandbox Code Playgroud)

如何才能实现这一目标?

python pandas pandas-groupby

5
推荐指数
1
解决办法
1339
查看次数

使用分组依据的熊猫百分比变化

假设我有以下数据帧:

df = pd.DataFrame({'city': ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd'], 
                   'year': [2013, 2014, 2016, 2015, 2016, 2013, 2016, 2017, 2018],
                  'value': [10, 12, 16, 20, 21, 11, 15, 13, 16]})
Run Code Online (Sandbox Code Playgroud)

我想找出每个城市和年份的价值与前一年相比的百分比变化。我的最终数据框将是:

city  year  value
   a  2013    NaN
   a  2014   0.20
   a  2016    NaN
   b  2015    NaN
   b  2016   0.05
   c  2013    NaN
   d  2016    NaN
   d  2017  -0.14
   d  2018   0.23
Run Code Online (Sandbox Code Playgroud)

我尝试在城市中使用一个组,然后使用 apply 但它没有用:

df.groupby('city').apply(lambda x: x.sort_values('year')['value'].pct_change()).reset_index()
Run Code Online (Sandbox Code Playgroud)

它没有用,因为我无法得到年份,也因为这样我正在考虑所有城市的所有年份,但事实并非如此。

编辑:我不太关心效率,所以任何解决问题的解决方案对我都是有效的。

python dataframe pandas

5
推荐指数
1
解决办法
57
查看次数

Pandas 数据框到元组列表的字典

假设我有以下数据框:

df = pd.DataFrame({'id': [1,2,3,3,3], 'v1': ['a', 'a', 'c', 'c', 'd'], 'v2': ['z', 'y', 'w', 'y', 'z']})
df
id  v1  v2
1   a   z
2   a   y
3   c   w
3   c   y
3   d   z
Run Code Online (Sandbox Code Playgroud)

我想将其转换为这种格式:

{1: [('a', 'z')], 2: [('a', 'y')], 3: [('c', 'w'), ('c', 'y'), ('d', 'z')]}
Run Code Online (Sandbox Code Playgroud)

我基本上想创建一个字典,其中键是 id,值是这个 id 的 (v1,v2) 的元组列表。

我尝试在 id 中使用 groupby:

df.groupby('id')[['v1', 'v2']].apply(list)
Run Code Online (Sandbox Code Playgroud)

但这没有用

python dataframe pandas pandas-groupby

4
推荐指数
1
解决办法
103
查看次数

获取在熊猫数据框中为真的列的名称

假设我有以下熊猫数据框:

df = pd.DataFrame({'id': [1,2,3,4,5], 'a': [True, True, False, True, False], 'b': [False, True, False, False, True], 'c': [False, False, True, True, True]})

 id      a      b      c
  1   True  False  False
  2   True   True  False
  3  False  False   True
  4   True  False   True
  5  False   True   True
Run Code Online (Sandbox Code Playgroud)

我想,对于每个 id,获取 True 列的名称,最终的 dict 将是:

{1: ['a'], 2: ['a', 'b'], 3: ['c'], 4: ['a', 'c'], 5: ['b', 'c']}
Run Code Online (Sandbox Code Playgroud)

我想也许可以通过用列名替换 True 并将它们聚合在一起,list但我无法想出解决方案。

编辑:如果 id 全部为 false,则只返回一个空列表。

python pandas

4
推荐指数
1
解决办法
44
查看次数

Pandas 基于两列

假设我有以下两个数据框:

df = pd.DataFrame({'col1':['a','b', 'c'], 'col2': ['q', 'w', 'e']})

df1 = pd.DataFrame({'col1': ['c', 'b', 'b', 'r','a', 'l', 'c'], 'col2': ['e', 'w', 'q', 'u', 'q', 'w', 'q']})
Run Code Online (Sandbox Code Playgroud)
print(df)
col1    col2
a   q
b   w
c   e

print(df1)
col1 col2
   c    e
   b    w
   b    q
   r    u
   a    q
   l    w
   c    q
Run Code Online (Sandbox Code Playgroud)

我想找到 df1 中 df 中的所有对并在新列中返回,我的预期输出将是:

col1 col2   col3
   c    e   True
   b    w   True
   b    q  False
   r    u  False
   a    q   True
   l    w  False
   c    q …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

2
推荐指数
1
解决办法
2888
查看次数

Pandas groupby 使用 agg 并同时 apply

我有以下数据框:

df = pd.DataFrame({'id': [1,1,1,2,3,2], 'year': ['2020', '2014', '2002', '2020', '2016', '2014'], 'e': [True, False, True, True, False, True], 'val': [100,200,300, 200, 300, 200]})

id  year      e  val
0   1  2020   True  100
1   1  2014  False  200
2   1  2002   True  300
3   2  2020   True  200
4   3  2016  False  300
5   2  2014   True  200
Run Code Online (Sandbox Code Playgroud)

我想要以下信息:

df.groupby('id').apply(lambda x: x[x['e']]['year'].min())
id
1    2002
2    2014
3     NaN
Run Code Online (Sandbox Code Playgroud)

df.groupby('id').val.sum()
id
1    600
2    400
3    300
Run Code Online (Sandbox Code Playgroud)

我的问题是是否可以将这两个返回到同一组中?还是我必须分开做然后合并?

python dataframe pandas

2
推荐指数
1
解决办法
1223
查看次数

Redshift python 连接器列名称是字节字符串

假设我在 redshift 中有下表:

a | b
-----
1 | 2
3 | 4
Run Code Online (Sandbox Code Playgroud)

如果我想将其从 Redshift 提取到 a,pd.DataFrame我可以执行以下操作:

import redshift_connector
import pandas as pd

query = 'SELECT * FROM table'
conn = redshift_connector(user=user, host=host, password=password, port=port, database=database)

df = pd.read_sql_query(query, conn)
Run Code Online (Sandbox Code Playgroud)

我正在使用以下包redshift_connector。但问题是,其中的列名df是字节字符串:

df['a']
Run Code Online (Sandbox Code Playgroud)

这将返回错误,因为列的名称是b'a'。有谁知道这个问题有什么解决方法吗?我已经编写了使用psycopg2普通字符串的代码,因此希望有一个不会改变太多代码的解决方案。

编辑:

版本

Python = 3.9.7

红移连接器 = 2.0.889

熊猫=1.2.5

python pandas amazon-redshift

1
推荐指数
1
解决办法
2113
查看次数