我试图将数据框中每一行value
与date1
匹配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>
非常感谢任何建议!
答案 0 :(得分:1)
您apply
可以groupby
使用apply
0
NaN
到print 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)