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
然后您可以做: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 数据框,以便每个元组的第一个值代表一列?