我正面临这个问题,其中我有一个数据帧,比如df1
:
>>> df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9), columns = ['A1','B1', 'C1',
'A2', 'B2', 'C2','A3','B3','C3'])
>>> df1
A1 B1 C1 A2 B2 C2 A3 B3 C3
0 0 1 2 3 4 5 6 7 8
1 9 10 11 12 13 14 15 16 17
2 18 19 20 21 22 23 24 25 26
3 27 28 29 30 31 32 33 34 35
4 36 37 38 39 40 41 42 43 44
和另一个数据帧df2
:
>>> df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['AB1','AB2','AB3'])
>>> df2
AB1 AB2 AB3
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
4 12 13 14
现在我想要的是,将df2的列插入到df1的特定位置,这样df1就变成了(实际上一个新的df也会起作用):
>>> df1
A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44
我现在通过创建一个新的空df来实现这一点,然后迭代这两个df的列,然后依次添加每一列。这是低效的、丑陋的,并且违背了数据流的全部目的。所以我很想知道,这个已经有方法了吗?我不确定这样的问题是否已经在这里得到了回答,但我肯定我没有找到任何结果。如果这是以前讨论过的,如果有人指给我看,我会很高兴。
您可以使用concat
,然后使用sorted by multiple attributes和change order by new value subset-[]
:
df = pd.concat([df1, df2], axis=1)
cols = sorted(df.columns, key = lambda x: (x[-1], x[:-1]))
print (cols)
['A1', 'AB1', 'B1', 'C1', 'A2', 'AB2', 'B2', 'C2', 'A3', 'AB3', 'B3', 'C3']
df = df[cols]
print (df)
A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44
另一个想法是在列中创建多索引
并按第二级排序,最后按映射
将多索引
放平:
df1.columns = [df1.columns.str[:1], df1.columns.str[1]]
df2.columns = [df2.columns.str[:2], df2.columns.str[2]]
df = pd.concat([df1, df2],axis=1).sort_index(axis=1, level=1)
df.columns = df.columns.map(''.join)
print (df)
A1 AB1 B1 C1 A2 AB2 B2 C2 A3 AB3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44
编辑:
有关更一般的解决方案,可以使用dataframe.reindex
和multiindex.from_product
:
df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9),
columns = ['A1','B1', 'C1', 'A2', 'B2', 'C2','A3','B3','C3'])
df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['Sum1','Sum2','Sum3'])
#change order of values in MultiIndex
df1.columns = [df1.columns.str[1], df1.columns.str[:1]]
df2.columns = [df2.columns.str[3], df2.columns.str[:3]]
mux = pd.MultiIndex.from_product([['1','2','3'], ['A','Sum','B','C']])
print (mux)
MultiIndex([('1', 'A'),
('1', 'Sum'),
('1', 'B'),
('1', 'C'),
('2', 'A'),
('2', 'Sum'),
('2', 'B'),
('2', 'C'),
('3', 'A'),
('3', 'Sum'),
('3', 'B'),
('3', 'C')],
)
df = pd.concat([df1, df2], axis=1).reindex(columns=mux)
df.columns = [f'{b}{a}' for a, b in df.columns]
print (df)
A1 Sum1 B1 C1 A2 Sum2 B2 C2 A3 Sum3 B3 C3
0 0 0 1 2 3 1 4 5 6 2 7 8
1 9 3 10 11 12 4 13 14 15 5 16 17
2 18 6 19 20 21 7 22 23 24 8 25 26
3 27 9 28 29 30 10 31 32 33 11 34 35
4 36 12 37 38 39 13 40 41 42 14 43 44
我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。
我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我
我有两个实体:矩阵和数据帧。矩阵在所有单元格中都有数字。第二个数据帧在几个单元格中有NA。如何确保第一个矩阵的NA与后一个数据帧中的NA处于相同的精确位置。 我试着完成。case()和na。省略,但不幸的是,这将一起删除行。我尝试了一个for循环,它先按列迭代,然后按行迭代,检查单元格的位置是否为零,并返回位置,然后将该位置反馈到indp数据帧中-得到一些关于维度的错误: 贯穿我的逻辑。这将一次迭
我有一个关于熊猫以及正确索引和替换值的问题。 我有两个数据帧,df1和df2,具有相同的列(Col1、Col2、Col3和Col4)。 在df1中,我想用另一个值(比如100)替换与df2中其他列(Col1、Col2和Col3)的值匹配的行中Col4中的值。 生成的df1看起来像这样: 我试过这样的方法: 但是我得到了错误,我不确定这是否达到了我想要的。
用其他dataframe的列值替换dataframe的一列中的nan值时出现问题。下面是一个测试示例: 我想用其他dataframe中的特定值替换列名中的Nan值(如果其中有一些Nan值,则不是其他列),例如此dataframe中的Name2值: 我想得到的是: 这是此示例的测试代码: 然后我尝试了这三种方法,但都不起作用——我的数据帧始终保持Nan值。 你能告诉我哪里出错了吗?
我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集: