【问题标题】:Concat columns in a for loop在 for 循环中连接列
【发布时间】:2019-01-05 09:19:36
【问题描述】:

我有以下数据集:

1   8   15  22
2   9   16  23
3   10  17  24
4   11  18  25
5   12  19  26
6   13  20  27
7   14  21  28

我想得到以下结果:

1
2
3
4
5
6
7
8
...
23
24
25
26
27
28

所以我想遍历我的数据集的所有列并将每一列连接到第一列。

import pandas as pd

df = pd.read_csv("data.csv", delimiter=";", header=-1)

number_of_columns= len(df.columns)
print(number_of_columns)


for i in range (1,number_of_columns):
  df1 = df.iloc[:,i]
  df2 = pd.concat([df,df1], ignore_index=True)


print(df2)

只有最后一列连接到最终数据框中。我知道 df2 在 for 循环的每次迭代中都会被覆盖。

那么如何在每个 for 循环之后“保存” df2 以便连接每一列?

非常感谢!

【问题讨论】:

  • 使用df.unstack()

标签: python python-3.x pandas for-loop concat


【解决方案1】:

按列

stack+tolist

df.stack().tolist()

[1,
 8,
 15,
 22,
 2,
 9,
 16,
 23,
 3,
 10,
 17,
 24,
 4,
 11,
 18,
 25,
 5,
 12,
 19,
 26,
 6,
 13,
 20,
 27,
 7,
 14,
 21,
 28]

逐行

melt

df.melt().value.tolist()

[1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 27,
 28]

unstack+tolist

df.unstack().tolist()

#outputs same as above

【讨论】:

    【解决方案2】:

    你也可以这样做:

    txt = '''1   8   15  22
    2   9   16  23
    3   10  17  24
    4   11  18  25
    5   12  19  26
    6   13  20  27
    7   14  21  28'''
    arr1 = np.fromstring(txt, dtype=int, sep=' ')
    arr1.reshape(7,-1).flatten(order = 'F') # for column wise, 'C' can be used for row wise.
    

    【讨论】:

      【解决方案3】:

      您可能不需要第 3 方库。您可以使用标准库中的 csvitertools 模块返回数字列表:

      from io import StringIO
      from itertools import chain
      import csv
      
      mystr = StringIO("""1   8   15  22
      2   9   16  23
      3   10  17  24
      4   11  18  25
      5   12  19  26
      6   13  20  27
      7   14  21  28""")
      
      with mystr as fin:
          reader = csv.reader(mystr, skipinitialspace=True, delimiter=' ')
          res = list(map(int, chain.from_iterable(zip(*reader))))
      
      print(res)
      
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
       11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
       21, 22, 23, 24, 25, 26, 27, 28]
      

      【讨论】:

        【解决方案4】:

        只需np.flatten()

         pd.Series(df.values.flatten())
         (or)
         pd.Series(df.unstack().values)
        

        【讨论】:

          猜你喜欢
          • 2019-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 2019-09-11
          • 2019-08-12
          相关资源
          最近更新 更多