条件求和基于另一个DataFrame列值

时间:2015-12-16 08:15:52

标签: python pandas sum conditional dataframe

我试图将数据框中每一行valuedate1匹配date2的所有id value date1 date2 sum A 150 4/8/2014 3/8/2014 nan B 100 5/8/2014 2/8/2014 nan B 200 7/8/2014 5/8/2014 100 A 200 4/8/2014 3/8/2014 nan A 300 6/8/2014 4/8/2014 350 相加,这与此question类似。

grp = df.groupby('id')
df['sum'] = grp.apply(lambda x: x[x['date1'] == df['date2'].values]['value'].sum())

我已经尝试过以下操作但仍然需要'长度必须匹配才能比较' 错误。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffee"
android:orientation="vertical"
android:theme="@style/AppTheme.NoActionBar"
>


<ImageView
    android:layout_width="60dp"
    android:layout_marginTop="100dp"
    android:layout_height="60dp"
    android:layout_gravity="center_horizontal"
    android:src="@drawable/check"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_marginTop="10dp"
    android:layout_height="wrap_content"
    android:text="Invitaton Sent Sucessfully"
    android:layout_gravity="center_horizontal"
    android:textStyle="bold"
    android:textSize="15dp"
    /></LinearLayout>

非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

apply可以groupby使用apply 0 NaNprint df # id value date1 date2 sum #0 A 150 2014-04-08 2014-03-08 NaN #1 B 100 2014-05-08 2014-02-08 NaN #2 B 200 2014-07-08 2014-05-08 100 #3 A 200 2014-04-08 2014-03-08 NaN #4 A 300 2014-06-08 2014-04-08 350 def f(x): x['sum1'] = x.date2.apply(lambda y: x[x.date1 == y].value.sum()).replace(0, np.nan) return x df = df.groupby('id').apply(f) print df # id value date1 date2 sum sum1 #0 A 150 2014-04-08 2014-03-08 NaN NaN #1 B 100 2014-05-08 2014-02-08 NaN NaN #2 B 200 2014-07-08 2014-05-08 100 100 #3 A 200 2014-04-08 2014-03-08 NaN NaN #4 A 300 2014-06-08 2014-04-08 350 350 使用其他replace

{{1}}

答案 1 :(得分:0)

您可以使用此应用功能:

def checkSum(record):
    date2 = record
    sum = df[df["date1"] == date2]["value"].sum()
    if sum == 0:
        return float('nan')
    else:
        return sum

df['sum2'] = df["date2"].apply(checkSum)