Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较熊猫组中的不同行_Python_Pandas_Pandas Groupby - Fatal编程技术网

Python 比较熊猫组中的不同行

Python 比较熊猫组中的不同行,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个5列多行的数据框架。它显示客户、产品、日期和一些值。我需要比较相同产品和相同日期的值。分组后,我得到了如下结果: client product date value1 value2 name1 p1 01/01/2001 10 15 name2 p1 01/01/2001 14 19 name3 p1 01/01/2001 18 22 name2 p2

我有一个5列多行的数据框架。它显示客户、产品、日期和一些值。我需要比较相同产品和相同日期的值。分组后,我得到了如下结果:

client  product   date          value1  value2
name1   p1        01/01/2001    10      15
name2   p1        01/01/2001    14      19
name3   p1        01/01/2001    18      22
name2   p2        01/01/2001    10      15
name4   p2        01/01/2001    14      19
name5   p2        01/01/2001    18      22
name1   p1        02/01/2001    10      18
name2   p1        02/01/2001    14      19
name3   p1        02/01/2001    18      22
name1   p2        02/01/2001    10      15
name4   p2        02/01/2001    14      19
name5   p2        02/01/2001    18      22
def f(x):
    x['comments'] = np.nan
    max_v1_idx = x['value1'].idxmax()
    min_v2_idx = x['value2'].idxmin()
    max_v1 = x.loc[max_v1_idx, 'value1']
    min_v2 = x.loc[min_v2_idx, 'value2']
    
    if min_v2 < max_v1:
        x.iloc[-1, x.columns.get_loc('comments')] = x.loc[min_v2_idx, 'client'] + ' to ' +  x.loc[max_v1_idx, 'client'] 
    
    return x
        
df.groupby(['product','date'])\
  .apply(f)
我现在需要做的是得到每组中value2列的最小值和value1列的最大值,并检查min(value2)
client  product   date          value1  value2  comments
name1   p1        01/01/2001    10      15
name2   p1        01/01/2001    14      19
name3   p1        01/01/2001    18      22      name1 to name3
name2   p2        01/01/2001    10      15
name4   p2        01/01/2001    14      19
name5   p2        01/01/2001    18      22      name2 to name5
name1   p1        02/01/2001    10      18
name2   p1        02/01/2001    14      19
name3   p1        02/01/2001    18      22
name1   p2        02/01/2001    10      15
name4   p2        02/01/2001    14      19
name5   p2        02/01/2001    18      22      name1 to name5
我对熊猫还不熟悉,我完全不知道该怎么做。我成功地完成了这段代码,但它并没有真正做到我想要的。它用最小值(可能不需要)填充整个新列。此外,它将与所有其他列进行比较,而不是与最大值进行比较

df = pd.read_csv("data.txt")
dfg = df.groupby(["product", "date"])
df = df.assign(min2=dfg["value2"].transform(min))
df["comment"] = np.where(df["value1"] > df["min2"], 1, 0)
最后一件事,我尝试使用loc获取客户端名称,但失败了。欢迎任何指导。谢谢


编辑:我没有正确解释这一点。注释需要从具有最小值(value2)的行和具有最大值(value2)的行中获取客户端名称,并将注释写入这两行中的一行。此外,我在示例中添加了更多数据,因此更加清晰。感谢您迄今为止给出的所有答案。

我使用
loc
对数据帧进行了相应的切片

df['comments'] = np.nan
for p in set(df['product']):
    max_ = df.loc[df['product'] == p,'value1'].max()
    min_ = df.loc[df['product'] == p,'value2'].min()
    if  max_ > min_:
        value_1 = df.loc[(df['product']== p) & (df['value1'] == max_),'client'] #getting the client(s) of the maximum value1
        value_2 = df.loc[(df['product']== p) & (df['value2'] == min_),'client'] #getting the client(s) of the maximum value2
        #commenting according to each name
        for v2 in value_2:
            for v1 in value_1:
                locking = (df['product'] == p) & (df['client'] == v1)
                df.loc[locking,'comments'] = v2 + ' to ' + v1
df

    client  product date        value1  value2  comments
0   name1   p1      01/01/2001  10      15      NaN
1   name2   p1      01/01/2001  14      19      NaN
2   name3   p1      01/01/2001  18      22      name1 to name3
3   name2   p2      01/01/2001  10      15      NaN
4   name4   p2      01/01/2001  14      19      NaN
5   name5   p2      01/01/2001  18      22      name1 to name5
6   name1   p1      02/01/2001  10      18      NaN
7   name2   p1      02/01/2001  14      19      NaN
8   name3   p1      02/01/2001  18      22      name1 to name3
9   name1   p2      02/01/2001  10      15      NaN
10  name4   p2      02/01/2001  14      19      NaN
11  name5   p2      02/01/2001  18      22      name1 to name5

此代码找到了4行而不是3行来插入注释。我相信这是正确的方法,因为在索引行8中,它在name1和name3中发现了另一个不正确的值。

IIUC,您可以使用如下自定义函数:

client  product   date          value1  value2
name1   p1        01/01/2001    10      15
name2   p1        01/01/2001    14      19
name3   p1        01/01/2001    18      22
name2   p2        01/01/2001    10      15
name4   p2        01/01/2001    14      19
name5   p2        01/01/2001    18      22
name1   p1        02/01/2001    10      18
name2   p1        02/01/2001    14      19
name3   p1        02/01/2001    18      22
name1   p2        02/01/2001    10      15
name4   p2        02/01/2001    14      19
name5   p2        02/01/2001    18      22
def f(x):
    x['comments'] = np.nan
    max_v1_idx = x['value1'].idxmax()
    min_v2_idx = x['value2'].idxmin()
    max_v1 = x.loc[max_v1_idx, 'value1']
    min_v2 = x.loc[min_v2_idx, 'value2']
    
    if min_v2 < max_v1:
        x.iloc[-1, x.columns.get_loc('comments')] = x.loc[min_v2_idx, 'client'] + ' to ' +  x.loc[max_v1_idx, 'client'] 
    
    return x
        
df.groupby(['product','date'])\
  .apply(f)
详情:


使用
groupby
从数据帧中获取记录组。使用
idxmin
idxmax
可以返回value1和value2的最大值索引
loc
我们可以在该索引中获取value1和value2的值。比较这些值,并使用
iloc
和-1分配组的最后一行,并使用
get\u loc

查找注释列的位置。是否可以添加更多的示例数据?很难根据此处给出的内容编写和测试代码。为什么标志消息是
name1到name2
?客户端名称不是索引,因此无法使用loc获取datafarame系列。你可以改为索引,然后你就可以cna loc了。我已经添加了更多的数据,并澄清了评论栏。谢谢你。谢谢你的回复。它真的很有用。我编辑了我的问题,因为我需要访问最大和最小行中的名称。以前不清楚。我亲爱的哈维尔。如果我可以问的话,你想要实现什么?试图找到
值的最大值并与最小值
值2
进行比较似乎很奇怪。例如,
value1
的第二高值可能高于
value2
的最小值,并且在注释中会被忽略。1的所有值是否都必须小于2的所有值?而且,我看不出这些评论实际上是如何解决任何问题的。我只需要一些关于您正在尝试执行的操作的上下文。大多数情况下,value1将低于value2。我只是想看看情况是否如此。我不需要第二个值,因为我已经标记该组中存在潜在错误。这条评论并不能解决任何问题,它只是让以后查看数据的人更容易一些。这很公平。我将上传我开发的解决方案