Python 数据帧部分和选定行之间按行划分

Python 数据帧部分和选定行之间按行划分,python,pandas,division,Python,Pandas,Division,几天前我问了一个相关的问题(),但不想编辑它,因为尽管是相关的,但这是一项新任务 拥有此数据(): 我想做的是,将类型为“cow”的每一行除以类型为“cal”的行,但两者的值都相同。如果某个日期有多个“cal”行,则应选择id较高的行。 对于显示的数据,第1-4行应除以第0行,第8-12行应除以第7行。(id“188”后的列是数值的起始位置)。结果应该是: date type id ... 1096 1097 1098 1 2

几天前我问了一个相关的问题(),但不想编辑它,因为尽管是相关的,但这是一项新任务

拥有此数据():

我想做的是,将类型为“cow”的每一行除以类型为“cal”的行,但两者的值都相同。如果某个日期有多个
“cal”
行,则应选择id较高的行。 对于显示的数据,第1-4行应除以第0行,第8-12行应除以第7行。(id“188”后的列是数值的起始位置)。结果应该是:

          date type   id    ...         1096      1097      1098
1   2014-06-13  cow   32    ...     0.029161 -0.052579 -0.098348
2   2014-06-13  cow   47    ...     0.427644  0.401395  0.381012
3   2014-06-13  cow  107    ...     0.231857  0.187632  0.156420
4   2014-06-13  cow  137    ...     0.210654  0.157386  0.124890
8   2014-10-24  cow   32    ...     4.690497  3.551748  3.266325
9   2014-10-24  cow   47    ...     5.051105  3.791418  3.463104
10  2014-10-24  cow  105    ...     3.171835  2.479936  2.297804
11  2014-10-24  cow  107    ...     3.856876  2.937823  2.713763
12  2014-10-24  cow  137    ...     5.122165  3.883989  3.561786
我设法对唯一的日期进行迭代,然后过滤和提取“cal”行和“cow”行,将它们分开,并将每个结果附加到一个空数据框中。以下是我使用的函数:

def divide_cal_date(mydata):
    cows = mydata[(mydata["type"] == "cow")]
    div_cows = pd.DataFrame()
    for i in mydata.date.unique():
        curr_cal = mydata[(mydata["date"] == i) & (mydata["type"] == "cal")].tail(1).iloc[:,3:]        
        temp_cows = cows[(cows["date"] == i)].copy()
        temp_cows.loc[:,3:] = cows[(cows["date"] == i)].iloc[:,3:].div(curr_cal.squeeze())
        div_cows = div_cows.append(temp_cows)        
        print(i, end="\r")
    print("end")
    return div_cows

正如我在上一个问题中所说的,我只是从熊猫开始,所以我想知道是否有一种更干净、高效、直接的方法来做到这一点。目前,它正在发挥作用,但任何建议都值得赞赏。

这对我来说已经足够好了,但请小心,
tail(1)
表示您的ID已排序。:)这对我来说已经足够好了,但要小心,
尾部(1)
意味着您的ID已排序。:)
def divide_cal_date(mydata):
    cows = mydata[(mydata["type"] == "cow")]
    div_cows = pd.DataFrame()
    for i in mydata.date.unique():
        curr_cal = mydata[(mydata["date"] == i) & (mydata["type"] == "cal")].tail(1).iloc[:,3:]        
        temp_cows = cows[(cows["date"] == i)].copy()
        temp_cows.loc[:,3:] = cows[(cows["date"] == i)].iloc[:,3:].div(curr_cal.squeeze())
        div_cows = div_cows.append(temp_cows)        
        print(i, end="\r")
    print("end")
    return div_cows