小编jon*_*boy的帖子

每月,每年分组的值计数-熊猫

我正在尝试groupby计算特定输出中每月和每年的日期。我每天都可以这样做,但是每月/每年都无法获得相同的输出。

d = ({
    'Date' : ['1/1/18','1/1/18','2/1/18','3/1/18','1/2/18','1/3/18','2/1/19','3/1/19'],                 
    'Val' : ['A','B','C','D','A','B','C','D'],                                      
     })

df = pd.DataFrame(data = d)

df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')

df['Count_d'] = df.Date.map(df.groupby('Date').size())
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出:

        Date Val  Count_d
0 2018-01-01   A        2
1 2018-01-01   B        2
2 2018-01-02   C        1
3 2018-01-03   D        1
4 2018-02-01   A        1
5 2018-03-01   B        1
6 2019-01-02   C        1
7 2019-01-03   D        1
Run Code Online (Sandbox Code Playgroud)

当我尝试执行类似操作但每月和每年执行一次时,请使用以下命令:

df1 = df.groupby([df['Date'].dt.year.rename('year'), df['Date'].dt.month.rename('month')]).agg({'count'})
print(df)
Run Code Online (Sandbox Code Playgroud)

但是输出是:

            Date   Val
           count count
year month            
2018 1         4     4
     2 …
Run Code Online (Sandbox Code Playgroud)

python group-by transform count pandas

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

确定值的分配-Python

我正在尝试创建最佳轮班时间表,在该时间表中将员工分配到轮班时间。输出应旨在花费最少的钱。棘手的部分是我需要考虑特定的约束。这些是:

1) At any given time period, you must meet the minimum staffing requirements
2) A person has a minimum and maximum amount of hours they can do
3) An employee can only be scheduled to work within their available hours
4) A person can only work one shift per day
Run Code Online (Sandbox Code Playgroud)

staff_availability df包含了员工的选择['Person'],可用最小-最大小时他们能够工作['MinHours']- ['MaxHours'],他们得到了多少钱['HourlyWage'],和可用性,表示小时['Availability_Hr']和15分钟片段['Availability_15min_Seg']

注意:如果不需要,可以不必分配可用的员工轮班。他们只是可以这样做。

staffing_requirements df包含一天中的时间['Time']和所需的工作人员['People']在这些时期。

该脚本返回df 'availability_per_member',显示每个时间点有多少员工可用。因此, …

python linear-programming pandas integer-programming pulp

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

德莱尼三角剖分的欧几里德距离 - Scipy

spatial导入的包Scipy可以测量指定点之间的欧几里德距离。是否可以使用Delaunay包装返回相同的测量值?使用df下面的方法,按 分组测量所有点之间的平均距离Time。但是,我希望使用 Delaunay 三角测量来测量平均距离。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay

df = pd.DataFrame({
    'Time' : [1,1,1,1,2,2,2,2],                  
    'A_X' : [5, 5, 6, 6, 4, 3, 3, 4], 
    'A_Y' : [5, 6, 6, 5, 5, 6, 5, 6],                         
        })

def make_points(x):
    return np.array(list(zip(x['A_X'], x['A_Y'])))

points = df.groupby("Time").apply(make_points)

for p in points:
    tri = Delaunay(p)
    ax.triplot(*p.T, tri.simplices)
Run Code Online (Sandbox Code Playgroud)

可以使用下面的方法测量所有点之间的平均距离,但我希望包含 Delaunay。

 avg_dist = (df.groupby(['Time']) …
Run Code Online (Sandbox Code Playgroud)

python delaunay scipy pandas

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

在散点之间绘制多个箭头

我正在尝试在两组散点之间绘制多个箭头。使用 绘制一条线非常容易ax.plot。但我正在尝试实现一个箭头而不是一条线。点之间的箭头似乎没有对齐。

因此,如果线图在下面初始化,它就可以正常工作。但箭袋图并不单独绘制相同的线条。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame(np.random.randint(-50,50,size=(100, 4)), columns=list('ABCD'))

fig, ax = plt.subplots()

x1 = df['A']
y1 = df['B']

x2 = df['C']
y2 = df['D']

AB = plt.scatter(x1, y1, c = 'blue', marker = 'o', s = 10, zorder = 3)
CD = plt.scatter(x2, y2, c = 'red', marker = 'o', s = 10, zorder = 2)

# plot line between points
#ax.plot([x1,x2],[y1,y2], color = 'black', linestyle …
Run Code Online (Sandbox Code Playgroud)

python matplotlib arrow-functions

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

从不同的选项分配值-熊猫

我有一个df包含大量Places重复周期的时间段。这些Places都是随机开始和结束的。对于每个时间段,我想将每个唯一位置分配给一个Group。这样做的中心规则是:

1)每个人一次Group最多只能拥有3个唯一Places 的人

2)唯一性Places应该均匀地分布在每个Group

我已将的小部分内容进行了细分df。有7个唯一值(但一次最多出现5个)和2个值Groups可供选择。但是在实践中,df总共可能包含多达50个唯一值,这些值分别代表结束和结束以及不同的时间段,这些值最多分布在6个组中。

为了了解Places当前正在发生多少,我添加了Total,它基于Place再次出现的情况。

df包含所有可用Groups的每一个独特的Place每个Period。位置GolfClub将完成,但我们假定所有其他位置都将在以后出现时继续df

df = pd.DataFrame({
    'Period' : [1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6],  
    'Place' : ['CLUB','CLUB','CLUB','HOME','HOME','AWAY','AWAY','WORK','WORK','AWAY','AWAY','GOLF','GOLF','CLUB','CLUB','POOL','POOL','HOME','HOME','WORK','WORK','AWAY','AWAY','POOL','POOL','TENNIS','TENNIS'],                                
    'Total' : [1,1,1,2,2,3,3,4,4,4,4,5,5,4,4,4,4,4,4,4,4,4,4,4,4,5,5],                            
    'Available Group' : ['1','2','1','2','1','2','1','2','1','1','2','1','2','2','1','2','1','2','1','2','1','1','2','1','2','2','1'],                           
    })
Run Code Online (Sandbox Code Playgroud)

引起我麻烦的主要问题是Places动态出现/存在。这样,它们完成了,新的开始了。因此,分配和分配当前的唯一Places需求以解决此概念

尝试:

def AssignPlace(df):
        uniquePlaces = df['Place'].unique()
        G3 = dict(zip(uniquePlaces, …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

pandas df 中每 15 分钟进行一次 Groupby 值

我正在尝试将值分组为pandas df休息时间。具体来说,我每 15 分钟返回一次值。我可以使用以下方法来做到这一点。但我希望每 15 分钟段返回一次值,即使值没有出现在df. 对于这些段,我将生成一个ffill()将先前的值分配给该段的位置。

import pandas as pd

d = ({
    'Time' : ['0/1/1900 8:00:00','0/1/1900 9:59:00','0/1/1900 10:00:00','0/1/1900 12:29:00','0/1/1900 12:30:00','0/1/1900 13:00:00','0/1/1900 13:02:00','0/1/1900 13:15:00','0/1/1900 13:20:00','0/1/1900 18:10:00','0/1/1900 18:15:00','0/1/1900 18:20:00','0/1/1900 18:25:00','0/1/1900 18:45:00','0/1/1900 18:50:00','0/1/1900 19:05:00','0/1/1900 19:07:00','0/1/1900 21:57:00','0/1/1900 22:00:00','0/1/1900 22:30:00','0/1/1900 22:35:00','1/1/1900 3:00:00','1/1/1900 3:05:00','1/1/1900 3:20:00','1/1/1900 3:25:00'],                 
    'People' : [1,1,2,2,3,3,2,2,3,3,4,4,3,3,2,2,3,3,4,4,3,3,2,2,1],                      
     })

df = pd.DataFrame(data = d)

df['Time'] = ['/'.join([str(int(x.split('/')[0])+1)] + x.split('/')[1:]) for x in df['Time']]
df['Time'] = pd.to_datetime(df['Time'], format='%d/%m/%Y %H:%M:%S') 

df = df.groupby(df.Time.dt.floor('15T'))['People'].max()
print(df)

Time
1900-01-01 08:00:00    1
1900-01-01 …
Run Code Online (Sandbox Code Playgroud)

python group-by pandas

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

同时替换 pandas df 中的多个值

我试图同时替换 pandas df 中的值。看来该函数是连续执行此操作的,因此我替换的值最终会被覆盖。使用下面的 where X == Left,我想替换A-D, B-C, C-B, D-A。如果我只执行其中一个调用,它会很好地工作,但当我执行所有四个调用时,它就不起作用了。以下是我的尝试:

import pandas as pd

df = pd.DataFrame({   
    'X' : ['Left','Left','Left','Left','Right','Right','Right','Right'],
    'Y' : ['A','B','C','D','A','B','C','D'],            
    })
Run Code Online (Sandbox Code Playgroud)

尝试1:

df[(df['X'] == 'Left') & (df['Y'] == 'A')] = df['Y'].map({'A': 'D'})
df[(df['X'] == 'Left') & (df['Y'] == 'B')] = df['Y'].map({'B': 'C'})
df[(df['X'] == 'Left') & (df['Y'] == 'C')] = df['Y'].map({'C': 'B'})
df[(df['X'] == 'Left') & (df['Y'] == 'D')] = df['Y'].map({'D': 'A'})
Run Code Online (Sandbox Code Playgroud)

出去:

       X  Y
0      D  D
1      C …
Run Code Online (Sandbox Code Playgroud)

python replace pandas

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

通过切片重命名熊猫列,导致合并失败

我有两个代表相似数据的数据框,但我想在更改列名称后合并。有几种方法可以实现这一点,但考虑到我的实际数据帧的大小,我想使用以下方法。我正在为第二个 df 返回 nan 值。

import pandas as pd

df1 = pd.DataFrame({
    'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],  
    'Val': ['1,2,3','1,2,3','1,2,3'],
    'Val2': [1,2,3],
    'Val3': [1.1,2.1,3.1]    
    })

df2 = pd.DataFrame({
    'time': ['2012-08-02 09:50:20.0','2012-08-02 09:50:32.5','2012-08-02 09:50:34.8'],
    'Val': ['1,2,3','1,2,3','1,2,3'],
    'Val2': [1,2,3],
    'Val3': [1.1,2.1,3.1]
    })

df1['time'] = pd.to_datetime(df1['time'])
df2['time'] = pd.to_datetime(df2['time'])

df1.columns.values[1:4] = ['first_' + str(x) for x in df1.columns[1:4]]
df2.columns.values[1:4] = ['second_' + str(x) for x in df2.columns[1:4]]

df3 = pd.merge(df1, df2, on = 'time')

print(df3)

                     time first_Val  first_Val2  first_Val3  second_Val  second_Val2  second_Val3
0 2012-08-02 …
Run Code Online (Sandbox Code Playgroud)

python merge pandas

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

将秒列转换为 hh:mm:ss - Pandas

我确定这是在 SO 中,但我似乎找不到它。我尝试转换columnfloats,以timestamps显示为hh:mm:ss。以下是我的尝试:

import pandas as pd

d = ({
    'A' : [100.4,200.2,300.3,400.6,500.8,600.9],                 
    'B' : [10.4,21.5,36.3,44.3,56.6,60.5],                                      
     })

df = pd.DataFrame(data = d)

df['A','B'] = pd.to_datetime(df['A','B'], unit='h')
Run Code Online (Sandbox Code Playgroud)

预期输出:

          A         B
0  00:01:40  00:00:10
1  00:03:20  00:00:22
2  00:05:00  00:00:36
3  00:06:41  00:00:44
4  00:08:21  00:00:57
5  00:10:01  00:01:01
Run Code Online (Sandbox Code Playgroud)

python timedelta pandas

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

将熊猫df中的所有值乘以组内的最大值

我正在尝试df为每个特定组返回一个熊猫内的最大值。然后,我想使用此最大值来乘以单独的值,然后在单独的列中返回。

例如,使用df下面的方法,每个组的最大值Item是:

X = 5
Y = 2
Run Code Online (Sandbox Code Playgroud)

我想使用这些值将所有其他值乘以单独的列。将熊猫作为pd导入

d = ({
    'Item' : ['X','X','X','Y','Y','Y','Y'],                 
    'Count' : [0,2,5,3,1,2,1],                                      
    })

df = pd.DataFrame(data = d)
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

df['Mult_max'] = df.groupby('Item').apply(lambda x: x['Count'].max() * x['Count'])
Run Code Online (Sandbox Code Playgroud)

预期输出:

  Group  Value  Mult_max
0     X      0         0
1     X      2        10
2     X      5        25
3     Y      3         9
4     Y      1         3
5     Y      2         6
6     Y      1         3
Run Code Online (Sandbox Code Playgroud)

python pandas

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

截断pandas df中值的小数位

我可以truncate使用单独的花车truncate在功能上math。但是当试图将相同的函数传递给一pandas df列时,我收到了一个错误。

import math
import pandas as pd

X = 1.1236

X = math.trunc(1000 * X) / 1000;

#Output
1.123
Run Code Online (Sandbox Code Playgroud)

但是当使用 a 时pandas df

d = ({
    'X' : [1.1234,1.1235],           
    })

df = pd.DataFrame(data=d)

df['X'] = math.trunc(1000 * df['X']) / 1000;
Run Code Online (Sandbox Code Playgroud)

错误:

df['X'] = math.trunc(1000 * df['X']) / 1000;

TypeError: type Series doesn't define __trunc__ method
Run Code Online (Sandbox Code Playgroud)

python math truncate pandas

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

在 pandas df 上运行计数

我正在尝试将运行计数返回columnpandas df. columns下面有两个df。当整数增加时,我想将增加的计数返回到相column对于Val Column.

import pandas as pd

d = ({
    'Val' : ['Foo','Bar','Foo','Foo','Foo','Bar','Foo','Bar'],
    'Int' : [0,1,2,2,3,4,4,5],
    }) 

df = pd.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)

出去:

   Val  Int
0  Foo    0
1  Bar    1
2  Cat    2
3  Foo    2
4  Foo    3
5  Bar    4
6  Foo    4
7  Bar    5
Run Code Online (Sandbox Code Playgroud)

当我尝试返回运行计数时,它只返回 NaN

for val in ['Foo','Bar']:
    cond = df.Val.eq(val) & df.Int.eq(int)
    df.loc[cond, 'Count_' + val] = cond[cond].cumsum()
Run Code Online (Sandbox Code Playgroud)

预期输出:

   Val  Int  Foo_Count …
Run Code Online (Sandbox Code Playgroud)

python count dataframe cumulative-sum pandas

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

在不可迭代函数上执行进度条-Python

关于此有一些问题,但是我似乎找不到在非迭代函数上执行进度条的问题。下面是合并两个单独的数据帧的函数。我希望将此功能插入显示进度的单独功能中。

from multiprocessing import Pool
import tqdm
import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randint(0,100,size=(100000, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(0,100,size=(100000, 4)), columns=list('AXYZ'))

def merge_df(df1, df2):

    df = pd.merge(left = df1, right = df2, how = 'left',
    left_on = 'A', right_on = 'A')
    return df

if __name__ == '__main__':
   with Pool(2) as p:
      r = list(tqdm.tqdm(p.imap(merge_df, df1, df2)))
Run Code Online (Sandbox Code Playgroud)

ValueError:DataFrame的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

python pandas progress-bar

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