如何有效地解析数据帧,同时使用特定模式将数据(特定行或多行)存储在其他数据帧中?

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