如何将数据框中的 2 行连接到新数据框中的 1 行?
How can I join 2 rows in a dataframe into 1 row in a new one?
我正在筛选格式为 excel 文件的外部数据源。我无法更改文件的生成方式。我需要过滤掉无用的行并将成对的行组合成一个。到目前为止,我的过程适用于过滤,但不适用于将连续两行中的相关数据合并为一行。
对于 Whosebug,数据帧没有很好地转换,但我在下面手动调整了它们。
数据转换
将下载内容转换为有用的格式
import pandas as pd
from pandas import DataFrame
from pandas.io.excel import read_excel
cpath = os.path.join (download_path, classes_report)
print (pd.__version__)
df = pd.read_excel (cpath, sheetname=0, header=None)
df.to_string()
0.14.1
0 1 2 3 4 5
0 Session: 2014-2015 NaN NaN NaN NaN NaN
1 Class Information Age Enrolled Key Room NaN
2 Math 10 12 / 18 03396 110 09:00:00
3 Teacher: Joe M Teacher NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN
9 Number of Classes: 1 Number of Students: 12 / 18 NaN NaN NaN NaN
10 Class Information Ages Enrolled Key Room NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00
12 Teacher: John A Instructor NaN NaN NaN NaN
13 NaN NaN NaN NaN NaN NaN
14 NaN NaN NaN NaN
15 NaN NaN NaN NaN
# Eliminate any rows where first column is NaN, contains 'Number of Classes', 'Class Information'
# or is blank
# The 5th column is tuition.
cf = df[df[0].notnull ()][1:]
cf = cf [~cf[0].str.contains ('Number of Classes')]
bf = cf[~cf[0].isin ([' ', 'Class Information'])]
bf.to_string()
0 1 2 3 4 5
2 Math 10 12 / 18 03396 110 09:00:00
3 Teacher: Joe M Teacher NaN NaN NaN NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00
12 Teacher: John A Instructor NaN NaN NaN NaN
left = DataFrame(bf.values [::2], index=bf.index[::2])
right = DataFrame(bf.values [1::2], index=bf.index[1::2])
pd.concat([left, right], axis=1).to_string ()
0 1 2 3 4 5 0 1 2 3 4 5
2 Math 10 12 / 18 03396 110 09:00:00 NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN Teacher: Joe M Teacher NaN NaN NaN NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00 NaN NaN NaN NaN NaN NaN
12 NaN NaN NaN NaN NaN NaN Teacher: John A Instructor NaN NaN NaN NaN
这里的目标是让 "Math" 行的最后五列包含以 "Teacher:" 开头的列,对于 "Art" 行也是如此,留下一个数据框两行而不是四行。
您尝试 concat
按索引对齐 2 个 df,从而生成一个不连续的 df,其中包含 4 行而不是 2 行:
right = DataFrame(bf.values [1::2], index=bf.index[1::2])
上面使用你的 df 中的值创建了一个新的 df,但你也使用了索引值,因为左右 df 的行数相同,你想按列连接它们这样索引对齐然后你可以使用左边的相同索引 df:
right = DataFrame(bf.values [1::2], index=left.index)
这将产生所需的串联 df。
我正在筛选格式为 excel 文件的外部数据源。我无法更改文件的生成方式。我需要过滤掉无用的行并将成对的行组合成一个。到目前为止,我的过程适用于过滤,但不适用于将连续两行中的相关数据合并为一行。
对于 Whosebug,数据帧没有很好地转换,但我在下面手动调整了它们。
数据转换
将下载内容转换为有用的格式
import pandas as pd
from pandas import DataFrame
from pandas.io.excel import read_excel
cpath = os.path.join (download_path, classes_report)
print (pd.__version__)
df = pd.read_excel (cpath, sheetname=0, header=None)
df.to_string()
0.14.1
0 1 2 3 4 5
0 Session: 2014-2015 NaN NaN NaN NaN NaN
1 Class Information Age Enrolled Key Room NaN
2 Math 10 12 / 18 03396 110 09:00:00
3 Teacher: Joe M Teacher NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN
9 Number of Classes: 1 Number of Students: 12 / 18 NaN NaN NaN NaN
10 Class Information Ages Enrolled Key Room NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00
12 Teacher: John A Instructor NaN NaN NaN NaN
13 NaN NaN NaN NaN NaN NaN
14 NaN NaN NaN NaN
15 NaN NaN NaN NaN
# Eliminate any rows where first column is NaN, contains 'Number of Classes', 'Class Information'
# or is blank
# The 5th column is tuition.
cf = df[df[0].notnull ()][1:]
cf = cf [~cf[0].str.contains ('Number of Classes')]
bf = cf[~cf[0].isin ([' ', 'Class Information'])]
bf.to_string()
0 1 2 3 4 5
2 Math 10 12 / 18 03396 110 09:00:00
3 Teacher: Joe M Teacher NaN NaN NaN NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00
12 Teacher: John A Instructor NaN NaN NaN NaN
left = DataFrame(bf.values [::2], index=bf.index[::2])
right = DataFrame(bf.values [1::2], index=bf.index[1::2])
pd.concat([left, right], axis=1).to_string ()
0 1 2 3 4 5 0 1 2 3 4 5
2 Math 10 12 / 18 03396 110 09:00:00 NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN Teacher: Joe M Teacher NaN NaN NaN NaN
11 Art 18 - 80 3 / 24 03330 110 10:00:00 NaN NaN NaN NaN NaN NaN
12 NaN NaN NaN NaN NaN NaN Teacher: John A Instructor NaN NaN NaN NaN
这里的目标是让 "Math" 行的最后五列包含以 "Teacher:" 开头的列,对于 "Art" 行也是如此,留下一个数据框两行而不是四行。
您尝试 concat
按索引对齐 2 个 df,从而生成一个不连续的 df,其中包含 4 行而不是 2 行:
right = DataFrame(bf.values [1::2], index=bf.index[1::2])
上面使用你的 df 中的值创建了一个新的 df,但你也使用了索引值,因为左右 df 的行数相同,你想按列连接它们这样索引对齐然后你可以使用左边的相同索引 df:
right = DataFrame(bf.values [1::2], index=left.index)
这将产生所需的串联 df。