我正在尝试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) 我正在尝试创建最佳轮班时间表,在该时间表中将员工分配到轮班时间。输出应旨在花费最少的钱。棘手的部分是我需要考虑特定的约束。这些是:
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',显示每个时间点有多少员工可用。因此, …
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) 我正在尝试在两组散点之间绘制多个箭头。使用 绘制一条线非常容易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) 我有一个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。位置Golf和Club将完成,但我们假定所有其他位置都将在以后出现时继续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) 我正在尝试将值分组为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) 我试图同时替换 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) 我有两个代表相似数据的数据框,但我想在更改列名称后合并。有几种方法可以实现这一点,但考虑到我的实际数据帧的大小,我想使用以下方法。我正在为第二个 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) 我确定这是在 SO 中,但我似乎找不到它。我尝试转换column的floats,以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) 我正在尝试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) 我可以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) 我正在尝试将运行计数返回column到pandas 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) 关于此有一些问题,但是我似乎找不到在非迭代函数上执行进度条的问题。下面是合并两个单独的数据帧的函数。我希望将此功能插入显示进度的单独功能中。
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()。