pandas数据帧中的可变移位

时间:2016-11-23 05:56:38

标签: python pandas dataframe

import pandas as pd

df = pd.DataFrame({'A':[3,5,3,4,2,3,2,3,4,3,2,2,2,3],
                   'B':[10,20,30,40,20,30,40,10,20,30,15,60,20,15]})

    A   B
0   3  10
1   5  20
2   3  30
3   4  40
4   2  20
5   3  30
6   2  40
7   3  10
8   4  20
9   3  30
10  2  15
11  2  60
12  2  20
13  3  15

我想添加一个C列,其中滚动平均值为B(滚动周期= A)。

例如,C的{​​{1}}值应为row index(2),而df.B.rolling(3).mean() = mean(10,20,30)的{​​{1}}值应为C。< / p>

1 个答案:

答案 0 :(得分:2)

可能很愚蠢...但是这就完成了

public class MainActivity extends AppCompatActivity {

    TextView txt_title;
    Button btn_send;
    EditText edt_notification;
    public final static String NOTIFICATION_DATA="NOTIFICATION_DATA";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txt_title= (TextView) findViewById(R.id.txt_title);
        edt_notification= (EditText) findViewById(R.id.edt_notification);
        btn_send= (Button) findViewById(R.id.btn_send);

        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SendNotification(Calendar.getInstance().getTimeInMillis(), edt_notification.getText().toString());

            }
        });


    }

    private void SendNotification(long timeInMillis, String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();

    }

}


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ir.wikichera.badamchi.sendnotification.MainActivity">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/txt_title"
    android:text="Notification Text:"
    android:textSize="18sp"
    android:textStyle="normal|bold" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="textPersonName"
    android:ems="10"
    android:layout_below="@+id/txt_title"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="10dp"
    android:id="@+id/edt_notification"
    android:hint="put your text here"
    android:singleLine="false" />

<Button
    android:text="Send"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/edt_notification"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="17dp"
    android:id="@+id/btn_send" />
</RelativeLayout>

<强> 解释
def crazy_apply(row): p = df.index.get_loc(row.name) a = row.A return df.B.iloc[p-a+1:p+1].mean() df.apply(crazy_apply, 1) 0 NaN 1 NaN 2 20.000000 3 25.000000 4 30.000000 5 30.000000 6 35.000000 7 26.666667 8 25.000000 9 20.000000 10 22.500000 11 37.500000 12 40.000000 13 31.666667 dtype: float64 遍历每列或每行。我们遍历每一行,因为我们使用了参数apply(请参阅axis=1作为1调用中的第二个参数)。因此apply的每次迭代都会传递一个代表当前行的pandas系列对象。当前索引值位于行的apply属性中。行对象的索引与name的列相同。

因此,df找到df.index.get_loc(row.name)中保存的当前索引值的序号位置。 row.name是该行的row.A列。