根据一些规则,如何在 Pandas 中扩展数据?
Posted
技术标签:
【中文标题】根据一些规则,如何在 Pandas 中扩展数据?【英文标题】:Based on some rules, how to expand data in Pandas? 【发布时间】:2022-01-14 02:37:58 【问题描述】:请原谅我的英语。我希望我能说清楚。
假设我们有这个数据:
>>> data = 'Span':[3,3.5], 'Low':[6.2,5.16], 'Medium':[4.93,4.1], 'High':[3.68,3.07], 'VeryHigh':[2.94,2.45], 'ExtraHigh':[2.48,2.06], '0.9':[4.9,3.61], '1.5':[3.23,2.38], '2':[2.51,1.85]
>>> df = pd.DataFrame(data)
>>> df
Span Low Medium High VeryHigh ExtraHigh 0.9 1.5 2
0 3.0 6.20 4.93 3.68 2.94 2.48 4.90 3.23 2.51
1 3.5 5.16 4.10 3.07 2.45 2.06 3.61 2.38 1.85
我想获取这些数据:
Span Wind Snow MaxSpacing
0 3.0 Low 0.0 6.20
1 3.0 Medium 0.0 4.93
2 3.0 High 0.0 3.68
3 3.0 VeryHigh 0.0 2.94
4 3.0 ExtraHigh 0.0 2.48
5 3.0 0 0.9 4.90
6 3.0 0 1.5 3.23
7 3.0 0 2.0 2.51
8 3.5 Low 0.0 5.16
9 3.5 Medium 0.0 4.10
10 3.5 High 0.0 3.07
11 3.5 VeryHigh 0.0 2.45
12 3.5 ExtraHigh 0.0 2.06
13 3.5 0 0.9 3.61
14 3.5 0 1.5 2.38
15 3.5 0 2.0 1.85
这些原则适用于df
:
Span
通过 Wind
和 Snow
的组合扩展得到 MaxSpacing
Wind
和 Snow
是 mutually exclusive
。当Wind
是'Low', 'Medium', 'High', 'VeryHigh', 'ExtraHigh'
之一时,Snow
为零;当Snow
是0.9, 1.5, 2
之一时,Wind
为零。
请帮忙。谢谢。
【问题讨论】:
【参考方案1】:使用DataFrame.melt
进行反透视,然后按索引排序,在DataFrame.insert
中按to_numeric
和Series.fillna
创建Snow
列,最后为Wind
列设置0
:
df = (df.melt('Span', ignore_index=False, var_name='Wind', value_name='MaxSpacing')
.sort_index(ignore_index=True))
s = pd.to_numeric(df['Wind'], errors='coerce')
df.insert(2, 'Snow', s.fillna(0))
df.loc[s.notna(), 'Wind'] = 0
print (df)
Span Wind Snow MaxSpacing
0 3.0 Low 0.0 6.20
1 3.0 Medium 0.0 4.93
2 3.0 High 0.0 3.68
3 3.0 VeryHigh 0.0 2.94
4 3.0 ExtraHigh 0.0 2.48
5 3.0 0 0.9 4.90
6 3.0 0 1.5 3.23
7 3.0 0 2.0 2.51
8 3.5 Low 0.0 5.16
9 3.5 Medium 0.0 4.10
10 3.5 High 0.0 3.07
11 3.5 VeryHigh 0.0 2.45
12 3.5 ExtraHigh 0.0 2.06
13 3.5 0 0.9 3.61
14 3.5 0 1.5 2.38
15 3.5 0 2.0 1.85
DataFrame.set_index
和 DataFrame.stack
的替代解决方案:
df = df.set_index('Span').rename_axis('Wind', axis=1).stack().reset_index(name='MaxSpacing')
s = pd.to_numeric(df['Wind'], errors='coerce')
df.insert(2, 'Snow', s.fillna(0))
df.loc[s.notna(), 'Wind'] = 0
print (df)
Span Wind Snow MaxSpacing
0 3.0 Low 0.0 6.20
1 3.0 Medium 0.0 4.93
2 3.0 High 0.0 3.68
3 3.0 VeryHigh 0.0 2.94
4 3.0 ExtraHigh 0.0 2.48
5 3.0 0 0.9 4.90
6 3.0 0 1.5 3.23
7 3.0 0 2.0 2.51
8 3.5 Low 0.0 5.16
9 3.5 Medium 0.0 4.10
10 3.5 High 0.0 3.07
11 3.5 VeryHigh 0.0 2.45
12 3.5 ExtraHigh 0.0 2.06
13 3.5 0 0.9 3.61
14 3.5 0 1.5 2.38
15 3.5 0 2.0 1.85
【讨论】:
我的蟒蛇是3.8.6
。我得到了TypeError: melt() got an unexpected keyword argument 'ignore_index'
。
@warem - 添加了替代解决方案。
成功了。很酷的家伙。谢谢你。将阅读手册以尝试了解您所做的事情。以上是关于根据一些规则,如何在 Pandas 中扩展数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从每个节点提取sklearn决策树规则到pandas布尔条件?
在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?
如何在 Pandas 或 Python 中根据某些条件放置项目?