【发布时间】:2018-08-04 18:44:10
【问题描述】:
可重现的例子:
df = pd.DataFrame([[1, '2015-12-15', 10],
[1, '2015-12-16', 13],
[1, '2015-12-17', 16],
[2, '2015-12-15', 19],
[2, '2015-12-11', 22],
[2, '2015-12-18', 25],
[3, '2015-12-14', 28],
[3, '2015-12-12', 31],
[3, '2015-12-15', 34]])
df.columns = ['X', 'Y', 'Z']
print(df.dtypes)
print()
print(df)
可重现示例的输出和每列的数据类型:
X int64
Y object
Z int64
dtype: object
X Y Z
0 1 2015-12-15 10
1 1 2015-12-16 13
2 1 2015-12-17 16
3 2 2015-12-15 19
4 2 2015-12-11 22
5 2 2015-12-18 25
6 3 2015-12-14 28
7 3 2015-12-12 31
8 3 2015-12-15 34
预期输出:
X Y Z
0 1 2015-12-15 10
1 1 2015-12-15 10
2 2 2015-12-11 22
3 2 2015-12-15 19
4 3 2015-12-12 31
5 3 2015-12-15 34
该输出的解释:
对于按X 分组后X 列中的每个组,我想要一行具有Z 列中的值
其中,该组的 Y 列中的值是 min(all dates/object in column Y) 并且相同
组,另一行在“Z”列中具有值,其中该组的列Y 中的值是some custom date that definitely exists for all groups which will be hardcoded。所以每个组都会有两行。
在我的输出中,对于组1,Z 列中的值是10,因为Z 列中的值与
对于1、12-15-2015 组,Y 列中所有日期的最小值是 10。对于同一组1,该组1 的第二行,Z 列中自定义日期12-15-2015 的值也是10。对于2 组,min(all dates/objects in column Y) 为2015-12-11,2 组Z 列中对应的值为Y,2015-12-11 列中的值为22。而对于自定义日期12-15-2015,它是19。
这是我假设的一些线性时间搜索/延迟代码,我为此编写了一些代码:
uniqueXs = list(dict(Counter(df['X'].tolist())).keys()) #Get every unique item in column X is a list.
df_list = [] #Empty list that will have rows of my final DataFrame
for x in uniqueXs: #Iterate through each unique value in column X
idfiltered_dataframe = df.loc[df['X'] == x] #Filter DataFrame based on the current value in column X
#(iterating through list of all values)
min_date = min(idfiltered_dataframe['Y']) #Min of column Y
custom_date = '2015-12-15' #Every group WILL have this custom date.
mindatefiltered_dataframe = idfiltered_dataframe.loc[idfiltered_dataframe['Y'] == min_date] #Within group, filter rows where column Y has minimum date
customdatefiltered_dataframe = idfiltered_dataframe.loc[idfiltered_dataframe['Y'] == custom_date] #Within group, filter rows where column Y has a custom date
for row_1 in mindatefiltered_dataframe.index: #Iterate through mindatefiltered DataFrame and create list of each row value required
row_list = [mindatefiltered_dataframe.at[row_1, 'X'], mindatefiltered_dataframe.at[row_1, 'Y'], mindatefiltered_dataframe.at[row_1, 'Z']]
df_list.append(row_list) #Append to a master list
for row_2 in customdatefiltered_dataframe.index: #Iterate through customdatefiltered DataFrame and create list of each row value required
row_list = [customdatefiltered_dataframe.at[row_2, 'X'], customdatefiltered_dataframe.at[row_2, 'Y'], customdatefiltered_dataframe.at[row_2, 'Z']]
df_list.append(row_list) #Append to a master list
print(pd.DataFrame(df_list)) #Create DataFrame out of the master list
我的印象是有一些巧妙的方法,您只需执行 df.groupby.. 并获得预期的输出,我希望有人可以为我提供此代码。
【问题讨论】:
标签: python python-3.x pandas pandas-groupby