在 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 方库。您可以使用标准库中的 csv
和 itertools
模块返回数字列表:
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 循环中 jdbc executeQuery(sql);出错