根据一些规则,如何在 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 通过 WindSnow 的组合扩展得到 MaxSpacing WindSnowmutually exclusive。当Wind'Low', 'Medium', 'High', 'VeryHigh', 'ExtraHigh' 之一时,Snow 为零;当Snow0.9, 1.5, 2 之一时,Wind 为零。

请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

使用DataFrame.melt 进行反透视,然后按索引排序,在DataFrame.insert 中按to_numericSeries.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_indexDataFrame.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 中扩展数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中扩展和创建以下数据集

如何从每个节点提取sklearn决策树规则到pandas布尔条件?

在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?

如何在 Pandas 或 Python 中根据某些条件放置项目?

在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?

如何根据有序列表替换pandas dataframe列中的元素?