【问题标题】:Pandas Reshape DataFrame in a loopPandas 在循环中重塑 DataFrame
【发布时间】:2021-03-13 04:50:38
【问题描述】:

我是 python 中的 Pandas 新手。我有一个数据框,其中有 2 个键,每个键 15 行,1 列,如下所示

            1
key1/1     0.5
key1/2     0.5
key1/3     0
key1/4     0
key1/5     0.6
key1/6     0.7
key1/7     0
key1/8     0
key1/9     0
key1/10    0.5
key1/11    0.5
key1/12    0.5
key1/13    0
key1/14    0.5
key1/15    0.5

key2/1     0.4
key2/2     0.2
key2/3     0
key2/4     0
key2/5     0.1
key2/6     0.2
key2/7     0
key2/8     0
key2/9     0.3
key2/10    0.2
key2/11    0
key2/12    0.5
key2/13    0
key2/14    0
key2/15    0.5

我想迭代数据框的行,因此每次遇到“零”时,它都会创建一个新列,如下所示

            1     2     3     4 
key1/1     0.5   0.6   0.5   0.5
key1/2     0.5   0.7   0.5   0.5
key1/3     nan   nan   0.5   nan
key1/4     nan   nan   nan   nan

            1     2     3     4     5
key2/1     0.4   0.1   0.3   0.5   0.5
key2/2     0.2   0.2   0.2   nan   nan
key2/3     nan   nan   nan   nan   nan
key2/4     nan   nan   nan   nan   nan

我已尝试以下代码尝试仅迭代“key1”

df2=pd.Dataframe[]
for row in df['key1'].index:
    new_df['keyl'][row] == df['keyl'][row]
    if df['keyl'][row] == 0:
         new_df['key1'].append(df2,ignore_index=True)

显然它不起作用,请发送一些帮助。理想情况下,我想修改相同的数据框而不是创建新的数据框。谢谢

编辑 下面是我的数据的样子

以下是我想要实现的目标

【问题讨论】:

  • 显然,这比你说的要多。当您点击 0 时,您希望跳过所有以下零,并让下一个非零开始一个新列。是吗?
  • 为什么 0.6 分配给 key1/1 ?当它是 key1/5 的一部分时
  • 是的,没错@TimRoberts
  • 我想以这种方式重塑我的数据框@Pygirl
  • 然后检查我的完整解决方案

标签: python pandas dataframe for-loop


【解决方案1】:

您可以使用零屏蔽它们并分配一个键。您可以根据键对它们进行分组并将它们转换为列。

所有功劳归于answer。你会在那里找到一个很好的解释。

df2 = df.mask((df['1'] == 0) )
df2['group'] = (df2['1'].shift(1).isnull() & df2['1'].notnull()).cumsum()
df2 = df2.dropna()
df2.pivot(columns='group')

1
group   1   2   3   4
key1/1  0.5 NaN NaN NaN
key1/10 NaN NaN 0.5 NaN
key1/11 NaN NaN 0.5 NaN
key1/12 NaN NaN 0.5 NaN
key1/14 NaN NaN NaN 0.5
key1/15 NaN NaN NaN 0.5
key1/2  0.5 NaN NaN NaN
key1/5  NaN 0.6 NaN NaN
key1/6  NaN 0.7 NaN NaN

您的组密钥将如下所示:

1   group
key1/1  0.5 1
key1/2  0.5 1
key1/3  NaN 1
key1/4  NaN 1
key1/5  0.6 2
key1/6  0.7 2
key1/7  NaN 2
key1/8  NaN 2
key1/9  NaN 2
key1/10 0.5 3
key1/11 0.5 3
key1/12 0.5 3
key1/13 NaN 3
key1/14 0.5 4
key1/15 0.5 4

您可以将这些数据转换成列格式。

完整解决方案:

df2 = df.mask((df['1'] == 0) )
df2['group'] = (df2['1'].shift(1).isnull() & df2['1'].notnull()).cumsum()
df2 = df2.dropna()
x = df2.groupby('group')['1'].apply(list)
df3 = pd.DataFrame(x.values.tolist()).T
df3.index = [f"key1/{i}" for i in range(1,len(df3)+1)]

        0   1   2   3
key1/1  0.5 0.6 0.5 0.5
key1/2  0.5 0.7 0.5 0.5
key1/3  NaN NaN 0.5 NaN

如果你想要那种格式的东西,你需要有这样的数据:

group
1         [0.5, 0.5]
2         [0.6, 0.7]
3    [0.5, 0.5, 0.5]
4         [0.5, 0.5]
Name: 1, dtype: object

更新1:

假设数据为:

def func(r):
    df2 = r.mask((r['1'] == 0) )
    df2['group'] = (df2['1'].shift(1).isnull() & df2['1'].notnull()).cumsum()
    df2 = df2.dropna()
    x = df2.groupby('group')['1'].apply(list)
    df3 = pd.DataFrame(x.values.tolist()).T
#     df3.index = [r.name]*len(df3)
    return (df3)

df.groupby(df.index).apply(func)

【讨论】:

  • 谢谢@Pygirl。如果我有 'Spain' 和 'Italy' 而不是 'key1' 和 'key2' 怎么办?似乎您的解决方案仅适用于 key1 并且也不能遍历键?谢谢
  • @ljcq09 逻辑也将保持不变。
  • 有没有办法迭代密钥? @Pygirl
  • @ljcq09 你能举个例子,那么我提供解决方案会更容易:)
  • 我已经更新了我的问题,谢谢 :) @Pygirl
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2018-04-12
  • 2017-06-12
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多