在 for 循环中连接列

Posted

技术标签:

【中文标题】在 for 循环中连接列【英文标题】:Concat columns in a for loop 【发布时间】: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() 【参考方案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)

【讨论】:

以上是关于在 for 循环中连接列的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中使用 lambda 函数连接信号槽

访问 VBA:连接动态列并循环执行

JavaScript用for循环实现九九乘法表

for 循环中 jdbc executeQuery(sql);出错

使用for循环(Python)追加/连接多个excel数据集

从 for 循环输出 Python 连接大数据帧