转置列 Pandas 数据帧后合并列
Combing Columns after Transposing Columns Pandas Dataframes
假设我有一组数据框
df1 是
ID C1
0 0 0.000000
1 1 0.538516
2 2 0.509902
3 3 0.648074
4 4 0.141421
df2 是
ID C1
0 0 0.538516
1 1 0.000000
2 2 0.300000
3 3 0.331662
4 4 0.608276
并且 df3 是
ID C1
0 0 0.509902
1 1 0.300000
2 2 0.000000
3 3 0.244949
4 4 0.509902
然后我继续转置这三个数据框。
df1 = df1.T
df2 = df2.T
df3 = df3.T
现在数据帧是:
df1 是
0 1 2 3 4
ID 0 1 2 3 4
C1 0 0.538516 0.509902 0.648074 0.141421
df2 是:
0 1 2 3 4
ID 0 1 2 3 4
C1 0.538516 0 0.3 0.331662 0.608276
df3 是:
0 1 2 3 4
ID 0 1 2 3 4
C1 0.509902 0.3 0 0.244949 0.509902
我能否以某种方式组合所有数据帧以具有
0 1 2 3 4
0 0.538516 0.509902 0.648074 0.141421
0.538516 0 0.3 0.331662 0.608276
0.509902 0.3 0 0.244949 0.509902
然后分别对行进行排序,以便对结果数据框中的每一行进行排序?
例如,已排序行的数据框将是
0 0.141421 0.509902 0.538516 0.648074
0 0.3 0.331662 0.538516 0.608276
0 0.244949 0.3 0.509902 0.509902
我在转置数据帧后遇到了连接问题。
感谢所有帮助
更新: 已排序数据集且未转置:
In [64]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[64]:
0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
解释:
In [67]: d1
Out[67]:
ID C1
0 0 0.000000
1 1 0.538516
2 2 0.509902
3 3 0.648074
4 4 0.141421
In [68]: d1['C1'].values
Out[68]: array([ 0. , 0.538516, 0.509902, 0.648074, 0.141421])
In [69]: np.sort(d1['C1'].values)
Out[69]: array([ 0. , 0.141421, 0.509902, 0.538516, 0.648074])
In [70]: [np.sort(x['C1'].values) for x in dfs]
Out[70]:
[array([ 0. , 0.141421, 0.509902, 0.538516, 0.648074]),
array([ 0. , 0.3 , 0.331662, 0.538516, 0.608276]),
array([ 0. , 0.244949, 0.3 , 0.509902, 0.509902])]
现在我们可以从已排序的 NumPy 数组列表创建一个 DataFrame,指定 d1.index
作为列:
In [71]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[71]:
0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
设置
df1 = pd.DataFrame({
'C1': [0.0, 0.538516, 0.509902, 0.648074, 0.141421],
'ID': [0, 1, 2, 3, 4]})
df2 = pd.DataFrame({
'C1': [0.538516, 0.0, 0.3, 0.331662, 0.608276],
'ID': [0, 1, 2, 3, 4]})
df3 = pd.DataFrame({
'C1': [0.509902, 0.3, 0.0, 0.244949, 0.509902],
'ID': [0, 1, 2, 3, 4]})
解决方案
1
看起来您的 ID
专栏很重要,也许这就是您想加入的内容。我会将其设置为您的索引,然后合并。
为了对每一行进行排序,我将保留为列并应用 sort_values
df = pd.concat(
[d.set_index('ID') for d in [df1, df2, df3]], ignore_index=True, axis=1)
df.apply(lambda x: x.sort_values().values).T
ID 0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
2
获取数据框并按 numpy
排序
df = pd.concat([d.set_index('ID').T for d in [df1, df2, df3]], ignore_index=True)
v = df.values
a = v.argsort(1)
i = np.arange(a.shape[0])[:, None]
df.loc[:] = v[i, a]
df
ID 0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
假设我有一组数据框
df1 是
ID C1
0 0 0.000000
1 1 0.538516
2 2 0.509902
3 3 0.648074
4 4 0.141421
df2 是
ID C1
0 0 0.538516
1 1 0.000000
2 2 0.300000
3 3 0.331662
4 4 0.608276
并且 df3 是
ID C1
0 0 0.509902
1 1 0.300000
2 2 0.000000
3 3 0.244949
4 4 0.509902
然后我继续转置这三个数据框。
df1 = df1.T
df2 = df2.T
df3 = df3.T
现在数据帧是:
df1 是
0 1 2 3 4
ID 0 1 2 3 4
C1 0 0.538516 0.509902 0.648074 0.141421
df2 是:
0 1 2 3 4
ID 0 1 2 3 4
C1 0.538516 0 0.3 0.331662 0.608276
df3 是:
0 1 2 3 4
ID 0 1 2 3 4
C1 0.509902 0.3 0 0.244949 0.509902
我能否以某种方式组合所有数据帧以具有
0 1 2 3 4
0 0.538516 0.509902 0.648074 0.141421
0.538516 0 0.3 0.331662 0.608276
0.509902 0.3 0 0.244949 0.509902
然后分别对行进行排序,以便对结果数据框中的每一行进行排序?
例如,已排序行的数据框将是
0 0.141421 0.509902 0.538516 0.648074
0 0.3 0.331662 0.538516 0.608276
0 0.244949 0.3 0.509902 0.509902
我在转置数据帧后遇到了连接问题。
感谢所有帮助
更新: 已排序数据集且未转置:
In [64]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[64]:
0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
解释:
In [67]: d1
Out[67]:
ID C1
0 0 0.000000
1 1 0.538516
2 2 0.509902
3 3 0.648074
4 4 0.141421
In [68]: d1['C1'].values
Out[68]: array([ 0. , 0.538516, 0.509902, 0.648074, 0.141421])
In [69]: np.sort(d1['C1'].values)
Out[69]: array([ 0. , 0.141421, 0.509902, 0.538516, 0.648074])
In [70]: [np.sort(x['C1'].values) for x in dfs]
Out[70]:
[array([ 0. , 0.141421, 0.509902, 0.538516, 0.648074]),
array([ 0. , 0.3 , 0.331662, 0.538516, 0.608276]),
array([ 0. , 0.244949, 0.3 , 0.509902, 0.509902])]
现在我们可以从已排序的 NumPy 数组列表创建一个 DataFrame,指定 d1.index
作为列:
In [71]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index)
Out[71]:
0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
设置
df1 = pd.DataFrame({
'C1': [0.0, 0.538516, 0.509902, 0.648074, 0.141421],
'ID': [0, 1, 2, 3, 4]})
df2 = pd.DataFrame({
'C1': [0.538516, 0.0, 0.3, 0.331662, 0.608276],
'ID': [0, 1, 2, 3, 4]})
df3 = pd.DataFrame({
'C1': [0.509902, 0.3, 0.0, 0.244949, 0.509902],
'ID': [0, 1, 2, 3, 4]})
解决方案
1
看起来您的 ID
专栏很重要,也许这就是您想加入的内容。我会将其设置为您的索引,然后合并。
为了对每一行进行排序,我将保留为列并应用 sort_values
df = pd.concat(
[d.set_index('ID') for d in [df1, df2, df3]], ignore_index=True, axis=1)
df.apply(lambda x: x.sort_values().values).T
ID 0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902
2
获取数据框并按 numpy
df = pd.concat([d.set_index('ID').T for d in [df1, df2, df3]], ignore_index=True)
v = df.values
a = v.argsort(1)
i = np.arange(a.shape[0])[:, None]
df.loc[:] = v[i, a]
df
ID 0 1 2 3 4
0 0.0 0.141421 0.509902 0.538516 0.648074
1 0.0 0.300000 0.331662 0.538516 0.608276
2 0.0 0.244949 0.300000 0.509902 0.509902