Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正在重塑数据帧_Python_Pandas - Fatal编程技术网

python正在重塑数据帧

python正在重塑数据帧,python,pandas,Python,Pandas,我有一个包含两列的数据框:id1和id2 df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [12,13,12,11,13,13]}) print(df) id1 id2 A 123 B 13 C 12 B 11 A 13 C 132 我想对其进行重塑(可能使用、groupby或pivot?)以获得以下信息: id1 id2-1 id2-2 A

我有一个包含两列的数据框:
id1
id2

df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [12,13,12,11,13,13]})
print(df)

id1     id2
A       123
B       13
C       12
B       11
A       13
C       132
我想对其进行重塑(可能使用、groupby或pivot?)以获得以下信息:

id1      id2-1    id2-2
A        123       13
B        13        11
C        12        132
请注意,每个
id1
正好有两行,但是
id2
有大量不同的值(因此我不想做一个热向量编码)

如果输出可以按字典顺序排序,则有一个首选项,即:

id1      id2-1    id2-2
A        13       123
B        11       13
C        12       132
i、 e.对于每一行,
id2-1
id2-2
中的值被排序(参见与
id1==“B”
相对应的行)。

这应该做到:

import pandas as pd
df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [123,13,12,11,13,132]})
df['id2'] = df['id2'].astype(str)
df = df.groupby(['id1']).agg(lambda x: '-'.join(x))
df['id2-1'] = df['id2'].apply(lambda x: x.split('-')[0]).astype(int)
df['id2-2'] = df['id2'].apply(lambda x: x.split('-')[1]).astype(int)
df = df.reset_index()[['id1', 'id2-1', 'id2-2']]
这应该做到:

import pandas as pd
df = pd.DataFrame({'id1': list('ABCBAC'), 'id2': [123,13,12,11,13,132]})
df['id2'] = df['id2'].astype(str)
df = df.groupby(['id1']).agg(lambda x: '-'.join(x))
df['id2-1'] = df['id2'].apply(lambda x: x.split('-')[0]).astype(int)
df['id2-2'] = df['id2'].apply(lambda x: x.split('-')[1]).astype(int)
df = df.reset_index()[['id1', 'id2-1', 'id2-2']]
计划

  • 我们希望创建一个索引,以便每次连续看到
    'id1'
    中的值。为此,我们将
    groupby('id1')
    然后使用
    cumcount()
    为我们提供新的索引
  • 然后,我们将索引设置为a
    pd。使用
    set\u index
  • 使用
    pd.MultiIndex
    我们设置为
    取消堆栈
  • 最后,我们使用一些复杂的映射重命名这些列

计划

  • 我们希望创建一个索引,以便每次连续看到
    'id1'
    中的值。为此,我们将
    groupby('id1')
    然后使用
    cumcount()
    为我们提供新的索引
  • 然后,我们将索引设置为a
    pd。使用
    set\u index
  • 使用
    pd.MultiIndex
    我们设置为
    取消堆栈
  • 最后,我们使用一些复杂的映射重命名这些列



我有一个小问题,因为我过度简化了我的样本。我的
id1
中充满了数字,因此
groupby.sum()
没有按计划运行。我已经更新了我的示例。请参见编辑:)遗憾的是,它只适用于2位数字是的,我再次编辑,我的
id2
数字的位数并不都相同(尽管,我认为通过简单的
apply
)可以更正。让我们再试一次,这应该不会失败:)事实上,既然数据中没有,为什么要用
-
拆分?我有一个小问题,因为我过度简化了我的示例。我的
id1
中充满了数字,因此
groupby.sum()
没有按计划运行。我已经更新了我的示例。请参见编辑:)遗憾的是,它只适用于2位数字是的,我再次编辑,我的
id2
数字的位数并不都相同(尽管,我认为通过简单的
apply
)可以更正。让我们再试一次,这应该不会失败:)事实上,既然数据中没有,为什么要用
-
拆分呢?这也是注释中的答案,供将来参考:)@A-Za-zkind@A-扎阿门。我同意。这是一个很好的回答。谢谢。您是否有办法对列中的值逐行排序?(比申请要快,不是吗?@ysearka我不知道你到底想怎么分类。然而,不管你在想什么,我相信有一种比使用
apply
更快的方法来做。这是一种答案,会在笔记中出现,供将来参考:)@a-Za-zkind@A-扎阿门。我同意。这是一个很好的回答。谢谢。您是否有办法对列中的值逐行排序?(比申请要快,不是吗?@ysearka我不知道你到底想怎么分类。但是,无论您在想什么,我相信有一种比使用
apply
更快的方法。