如何有效地解析数据帧,同时使用特定模式将数据(特定行或多行)存储在其他数据帧中?
How to parse a dataframe efficiently, while storing data (specific row, or multiple rows) in others dataframe using a specific pattern?
如何解析所有行的数据,并使用该行用来自多行的数据填充其他数据帧?
我正在尝试解析包含多个数据条目的 csv 文件以用于培训目的,因为我对这项技术还很陌生。
我的数据包含 10 列和数百行。
第一列填充了 10、50 或 90 的代码。
示例:
数据框 1:
0
1
10
Power-220
90
End
10
Power-290
90
End
10
Power-445
90
End
10
Power-390
50
Clotho
50
Kronus
90
End
10
Power-550
50
Ares
50
Athena
50
Artemis
50
Demeter
90
End
并且列表还在继续..
一方面,我希望能够读取第一个单元格,并在代码为 10 时直接填充另一个数据帧。
另一方面,我想用所有代码 50 填充另一个数据框,但我希望能够从之前的代码 10 中获取数据,因为它包含所使用的 Power 类型,并在此数据框上填充一个新列。
新的数据框应该是这样的:
数据框 2:
0
1
10
Power-220
10
Power-290
10
Power-445
10
Power-390
10
Power-550
数据框 3:
0
1
2
50
Clotho
Power-390
50
Kronus
Power-390
50
Ares
Power-550
50
Athena
Power-550
50
Artemis
Power-550
50
Demeter
Power-550
到目前为止,我一直在使用 iterrows,我到处都读到这是个坏主意..但我正在努力实施另一种方法..
在我的代码中,我只创建了另外两个数据帧,但我还不知道从前一个单元格中检索数据的方法。我通常会使用经典方法,但我认为它相当陈旧。
for index, row in df.iterrows():
if (df.iat[index,0] == '10'):
df2 = df2.append(df.loc[index], ignore_index = True)
if (df.iat[index,0] == '50'):
df3 = df3.append(df.loc[index], ignore_index = True)
有什么想法吗?
(更新)
您可以简单地将所需的行复制到另一个数据框,
df2 = df[df.col_1 == '10'].copy()
这将创建一个新的数据框 df2
,其中仅包含列 col_1
中符合某些条件的行。 copy()
函数保证两个数据帧不相同,一个的改变不会影响另一个。
如果df2
已经存在,您可以将它们连接起来
df2 = pd.concat([df2, df[df.col_1 == '10'].copy()])
对于df2,很简单:
df2 = df.rename(columns={'Power/Character': 'Power'}) \
.loc[df['Code'] == 10, :]
对于df3,有点复杂:
# Extract power and fill forward values
power = df.loc[df['Code'] == 10, 'Power/Character'].reindex(df.index).ffill()
df3 = df.rename(columns={'Power/Character': 'Character'}) \
.assign(Power=power).loc[lambda x: x['Code'] == 50]
输出:
>>> df2
Code Power
0 10 Power-220
2 10 Power-290
4 10 Power-445
6 10 Power-390
10 10 Power-550
>>> df3
Code Character Power
7 50 Clotho Power-390
8 50 Kronus Power-390
11 50 Ares Power-550
12 50 Athena Power-550
13 50 Artemis Power-550
14 50 Demeter Power-550
如何解析所有行的数据,并使用该行用来自多行的数据填充其他数据帧?
我正在尝试解析包含多个数据条目的 csv 文件以用于培训目的,因为我对这项技术还很陌生。
我的数据包含 10 列和数百行。 第一列填充了 10、50 或 90 的代码。 示例:
数据框 1:
0 | 1 |
---|---|
10 | Power-220 |
90 | End |
10 | Power-290 |
90 | End |
10 | Power-445 |
90 | End |
10 | Power-390 |
50 | Clotho |
50 | Kronus |
90 | End |
10 | Power-550 |
50 | Ares |
50 | Athena |
50 | Artemis |
50 | Demeter |
90 | End |
并且列表还在继续..
一方面,我希望能够读取第一个单元格,并在代码为 10 时直接填充另一个数据帧。
另一方面,我想用所有代码 50 填充另一个数据框,但我希望能够从之前的代码 10 中获取数据,因为它包含所使用的 Power 类型,并在此数据框上填充一个新列。
新的数据框应该是这样的:
数据框 2:
0 | 1 |
---|---|
10 | Power-220 |
10 | Power-290 |
10 | Power-445 |
10 | Power-390 |
10 | Power-550 |
数据框 3:
0 | 1 | 2 |
---|---|---|
50 | Clotho | Power-390 |
50 | Kronus | Power-390 |
50 | Ares | Power-550 |
50 | Athena | Power-550 |
50 | Artemis | Power-550 |
50 | Demeter | Power-550 |
到目前为止,我一直在使用 iterrows,我到处都读到这是个坏主意..但我正在努力实施另一种方法..
在我的代码中,我只创建了另外两个数据帧,但我还不知道从前一个单元格中检索数据的方法。我通常会使用经典方法,但我认为它相当陈旧。
for index, row in df.iterrows():
if (df.iat[index,0] == '10'):
df2 = df2.append(df.loc[index], ignore_index = True)
if (df.iat[index,0] == '50'):
df3 = df3.append(df.loc[index], ignore_index = True)
有什么想法吗?
(更新)
您可以简单地将所需的行复制到另一个数据框,
df2 = df[df.col_1 == '10'].copy()
这将创建一个新的数据框 df2
,其中仅包含列 col_1
中符合某些条件的行。 copy()
函数保证两个数据帧不相同,一个的改变不会影响另一个。
如果df2
已经存在,您可以将它们连接起来
df2 = pd.concat([df2, df[df.col_1 == '10'].copy()])
对于df2,很简单:
df2 = df.rename(columns={'Power/Character': 'Power'}) \
.loc[df['Code'] == 10, :]
对于df3,有点复杂:
# Extract power and fill forward values
power = df.loc[df['Code'] == 10, 'Power/Character'].reindex(df.index).ffill()
df3 = df.rename(columns={'Power/Character': 'Character'}) \
.assign(Power=power).loc[lambda x: x['Code'] == 50]
输出:
>>> df2
Code Power
0 10 Power-220
2 10 Power-290
4 10 Power-445
6 10 Power-390
10 10 Power-550
>>> df3
Code Character Power
7 50 Clotho Power-390
8 50 Kronus Power-390
11 50 Ares Power-550
12 50 Athena Power-550
13 50 Artemis Power-550
14 50 Demeter Power-550