将N by N Dataframe转换为3 Column Dataframe

时间:2016-03-03 15:57:41

标签: python pandas dataframe

我在Windows 10计算机上使用带有Pandas的Python 2.7。

我有一个n乘Dataframe其中:

1)索引代表人名

2)列标题的顺序是相同的人名

3)Dataframe的每个单元格是他们每天通过电子邮件发送的平均次数。

如何将Dataframe转换为包含3列的Dataframe,其中:

1)第1列将是n乘以Dataframe

的索引

2)第2列是n乘Dataframe

的行标题

3)第3列将是与索引中的那两个名称对应的单元格值,来自n乘以Dataframe

的列标题组合

修改

没有提供我正在寻找的例子的应用。我想从下面的代码中获取df1并将其转换为rel_df。

import pandas as pd
from itertools import permutations
df1 = pd.DataFrame()
df1['index'] = ['a', 'b','c','d','e']
df1.set_index('index', inplace = True)
df1['a'] = [0,1,2,3,4]
df1['b'] = [1,0,2,3,4]
df1['c'] = [4,1,0,3,4]
df1['d'] = [5,1,2,0,4]
df1['e'] = [7,1,2,3,0]

##df of all relationships to build
flds = pd.Series(SO_df.fld1.unique())
flds = pd.Series(flds.append(pd.Series(SO_df.fld2.unique())).unique())

combos = []
for L in range(0, len(flds)+1):
  for subset in permutations(flds, L):
      if len(subset) == 2:
          combos.append(subset)
      if len(subset) > 2:
          break

rel_df = pd.DataFrame.from_records(data = combos, columns = ['fld1','fld2'])
rel_df['value'] = [1,4,5,7,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4]

print df1
>>> print df1
       a  b  c  d  e
index               
a      0  1  4  5  7
b      1  0  1  1  1
c      2  2  0  2  2
d      3  3  3  0  3
e      4  4  4  4  0

>>> print rel_df
   fld1 fld2  value
0     a    b      1
1     a    c      4
2     a    d      5
3     a    e      7
4     b    a      1
5     b    c      1
6     b    d      1
7     b    e      1
8     c    a      2
9     c    b      2
10    c    d      2
11    c    e      2
12    d    a      3
13    d    b      3
14    d    c      3
15    d    e      3
16    e    a      4
17    e    b      4
18    e    c      4
19    e    d      4

2 个答案:

答案 0 :(得分:2)

使用melt

reset_index

(如果您在实际代码中明确设置了索引,只需跳过该步骤而不是执行melt; # Flatten your dataframe. df = df1.stack().reset_index() # Remove duplicates (e.g. fld1 = 'a' and fld2 = 'a'). df = df.loc[df.iloc[:, 0] != df.iloc[:, 1]] # Rename columns. df.columns = ['fld1', 'fld2', 'value'] >>> df fld1 fld2 value 1 a b 1 2 a c 4 3 a d 5 4 a e 7 5 b a 1 7 b c 1 8 b d 1 9 b e 1 10 c a 2 11 c b 2 13 c d 2 14 c e 2 15 d a 3 16 d b 3 17 d c 3 19 d e 3 20 e a 4 21 e b 4 22 e c 4 23 e d 4 对索引不起作用。)< / p>

答案 1 :(得分:2)

{{1}}