我有以下数据框:
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)
如何才能实现这一目标?
假设我有以下数据帧:
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)
它没有用,因为我无法得到年份,也因为这样我正在考虑所有城市的所有年份,但事实并非如此。
编辑:我不太关心效率,所以任何解决问题的解决方案对我都是有效的。
假设我有以下数据框:
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)
但这没有用
假设我有以下熊猫数据框:
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,则只返回一个空列表。
假设我有以下两个数据框:
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) 我有以下数据框:
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)
我的问题是是否可以将这两个返回到同一组中?还是我必须分开做然后合并?
假设我在 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