dataframe已按照“date”升序排列每天对应两行数据,如何按照奇偶行计算每一天及前面所有日期的特征“a”的中位数(如奇数行2018-1-1则应取改天前所有日期奇数行对应的数据求中位数,偶数行则对应每个日期偶数行进行计算),并加一列用以保存
时间: 2024-03-08 07:47:59 浏览: 58
可以使用以下代码实现:
``` python
import pandas as pd
# 读取数据并按照日期升序排序
df = pd.read_csv('your_data.csv')
df = df.sort_values('date')
# 计算中位数并添加新列
median_list = []
for i in range(len(df)):
if i % 2 == 0:
# 奇数行,计算该行以及前面所有日期的奇数行特征"a"的中位数
odd_rows = df.loc[0:i:2, 'a']
median = odd_rows.median()
median_list.append(median)
else:
# 偶数行,计算该行以及前面所有日期的偶数行特征"a"的中位数
even_rows = df.loc[0:i:2, 'a']
median = even_rows.median()
median_list.append(median)
df['a_median'] = median_list
```
这段代码首先读取数据并按照日期升序排序,然后遍历每一行,如果是奇数行则计算该行以及前面所有日期的奇数行特征"a"的中位数,并将结果添加到一个列表中;如果是偶数行则计算该行以及前面所有日期的偶数行特征"a"的中位数,并将结果添加到列表中。最后将列表中的值添加到数据框中的新列'a_median'中。
相关问题
dataframe已按照“date”升序排列每天对应两行数据,如何按照奇偶行计算每一天及前面所有日期的特征“a”的中位数(如奇数行2018-1-1则应取改天前所有日期奇数行对应的数据求中位数),并加一列用以保存
可以使用以下代码实现:
``` python
import pandas as pd
# 读取数据并按照日期升序排序
df = pd.read_csv('your_data.csv')
df = df.sort_values('date')
# 计算中位数并添加新列
median_list = []
for i in range(len(df)):
if i % 2 == 0:
# 偶数行直接跳过
continue
# 奇数行,计算该行以及前面所有日期的奇数行特征"a"的中位数
odd_rows = df.loc[0:i:2, 'a']
median = odd_rows.median()
median_list.append(median)
median_list = [None] * len(df) if len(median_list) == 0 else median_list
df['a_median'] = median_list
```
这段代码首先读取数据并按照日期升序排序,然后遍历每一行,如果是偶数行则跳过,如果是奇数行则计算该行以及前面所有日期的奇数行特征"a"的中位数,并将结果添加到一个列表中。最后将列表中的值添加到数据框中的新列'a_median'中。如果列表为空,则将新列的所有值设为None。
dataframe已按照“date”升序排列,如何计算每一天及前面所有日期的特征“a”的中位数,并加一列用以保存
可以使用 pandas 的 rolling 方法结合 apply 方法实现。具体的代码如下:
```python
import pandas as pd
# 假设 DataFrame 的名称为 df,特征为 "a",日期列为 "date"
df["median_a"] = df.sort_values("date").rolling(len(df), min_periods=1)["a"].apply(lambda x: x.median())
```
首先,我们使用 sort_values 方法将 DataFrame 按照日期升序排列。然后,我们使用 rolling 方法创建一个滑动窗口,大小为整个 DataFrame 的长度,即 len(df),并且设置 min_periods=1,表示即使窗口中只有一个元素,也会计算结果。最后,我们使用 apply 方法对窗口中的 "a" 特征进行中位数计算,并将结果保存到新列 "median_a" 中。
阅读全文