pandas:将数据重新设置为以一定大小的第一个值开头?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas:将数据重新设置为以一定大小的第一个值开头?相关的知识,希望对你有一定的参考价值。

我有一个看起来像这样的数据框:

df = pd.DataFrame(data=d)
d = [
     "name": "Bob", "1/1/20": 10, "1/2/20": 24, "1/3/20": 38 ,
     "name": "Charlie", "1/1/20": 0, "1/2/20": 0, "1/3/20": 5 ,
     "name": "Helen", "1/1/20": 4, "1/2/20": 14, "1/3/20": 24 ,
     "name": "Sarah", "1/1/20": 2, "1/2/20": 4, "1/3/20": 11 
]

我想重新建立此数据的基础,因此对于每个人,它都从值大于10的第一天开始。

我还想重命名列,以便它们相对于第一天的值大于10,而不是绝对天数。

换句话说,我想要一个看起来像这样的输出数据框:

name     day1     day2     day2
Bob      10       24       38
Charlie  
Helen    14       24
Sarah    11

大熊猫有可能吗?

更新:也许我应该将其分解为较小的任务:

  • 逐行提取所有大于100的值的数组
  • 对于每一行,将其附加到新的数组数组中,并用空值右键填充。

也许根本不使用熊猫会更好吗?

答案
df.set_index('name', inplace=True) df.where(df >= 10).stack().to_frame('Value'). \ assign(Day=lambda x: x.groupby(level=0).cumcount() + 1). \ reset_index(level=0).pivot('name', 'Day', 'Value').add_prefix('Day').reindex(df.index) Out[37]: Day Day1 Day2 Day3 name Bob 10.0 24.0 38.0 Charlie NaN NaN NaN Helen 14.0 24.0 NaN Sarah 11.0 NaN NaN
另一答案
首先选择要订购的列:

DataFrame.where

DataFrame.where

然后您可以做:
cols = df.columns.difference(['name'])

cols = pd.to_datetime(df.columns,errors='coerce').notna()

也可以用df.loc[:,cols]=np.sort(df.loc[:,cols].where(lambda x: x.ge(10)))
df.loc[:,cols]=df.loc[:,cols].fillna('')
print(df)
选择
name 1/1/20 1/2/20 1/3/20 0 Bob 10 24 38 1 Charlie 2 Helen 14 24 3 Sarah 11

以上是关于pandas:将数据重新设置为以一定大小的第一个值开头?的主要内容,如果未能解决你的问题,请参考以下文章

pandas基础运算

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

Pandas 数据框行到列表的字典,使用每行的第一个值作为键

Pandas 根据列中的最小值到最大值对行进行重新排序

将查询结果显示为以逗号分隔的文字

Pandas Dataframe 将具有两个值的分类列重新映射为二进制