gpt4 book ai didi

python - 如何在某些条件下创建 DataFrame 输出?

转载 作者:行者123 更新时间:2023-12-04 03:29:53 25 4
gpt4 key购买 nike

我有 2 个包含音调值的字符串列表:

pitch_detected = ['A#3 / Bb3', 'B3', 'C4', 'C#4 / Db4', 'D4', 'D#4 / Eb4', 'E4', 'F4']
pitch_dataset = ['G#3 / Ab3', 'A#3 / Bb3', 'B3', 'C4', 'C#4 / Db4', 'D4', 'D#4 / Eb4', 'E4', 'F4', 'F#4 / Gb4', 'G4']

稍后我需要在 HTML 页面上打印它们。现在,我使用这段代码,没有遇到任何问题。

  df = pd.DataFrame(data = [pitch_dataset, pitch_class])
df.index = ['Pitch from dataset', 'Pitch detected']
df = df.T
table_result = df.to_html()

这是从数据框 df 创建的当前 HTML 输出。 current output

虽然输出看起来不错,但我需要在一些条件下呈现它。我认为,这可以通过在使用 to_html() 打印到 HTML 之前先操作 DataFrame 来实现。条件如下:

  1. 如果音高 X 存在 pitch_datasetpitch_detected 中,则音高 X 将显示在侧面-旁边。
  2. 如果 pitch_dataset 中存在pitch_detected存在音高 X, 中的行pitch_detected 将由 - 填充。
  3. 如果音高 X 存在于pitch_dataset中但存在于pitch_detected中,则音高X将显示在pitch_detected 列,pitch_dataset 中的额外行将由 - 填充。

有什么办法可以用Python实现这个条件吗?

这是我想要的示例所需输出,由 Microsoft Excel 生成,带有条件注释。条件1和2与上面给出的输出表相同,而条件3是为了举例而手动制作的,pitch_detected列表为:

pitch_detected = ['A#3 / Bb3', 'B3', 'C4', 'C#4 / Db4', 'D4', 'D#4 / Eb4', 'E4', 'F4', 'A4', 'B4']

在实际输出中,我不需要突出显示。 sample output with comments

编辑:因为我收到了重复问题的通知here ,我需要说明我面临的问题与疑似重复问题不同。

最佳答案

您可以将 df 与其自身合并,并提取具有对齐的 Pitch X(并排)的 2 列。然后用-替换NaN的值,如下:

df2 = df.merge(df, left_on='Pitch detected', right_on='Pitch from dataset', how='outer', indicator=True)[['Pitch from dataset_y', 'Pitch detected_x']]

df3 = df2.dropna(how='all').fillna('-').rename(columns={'Pitch from dataset_y': 'Pitch from dataset', 'Pitch detected_x': 'Pitch detected'})




print(df3)

Pitch from dataset Pitch detected
0 A#3 / Bb3 A#3 / Bb3
1 B3 B3
2 C4 C4
3 C#4 / Db4 C#4 / Db4
4 D4 D4
5 D#4 / Eb4 D#4 / Eb4
6 E4 E4
7 F4 F4
8 - A4
9 - B4
11 G#3 / Ab3 -
12 F#4 / Gb4 -
13 G4 -

在这里,我把步骤分解一下,供大家引用:

仅通过合并步骤,我们得到:

df.merge(df, left_on='Pitch detected', right_on='Pitch from dataset', how='outer', indicator=True)



Pitch from dataset_x Pitch detected_x Pitch from dataset_y Pitch detected_y _merge
0 G#3 / Ab3 A#3 / Bb3 A#3 / Bb3 B3 both
1 A#3 / Bb3 B3 B3 C4 both
2 B3 C4 C4 C#4 / Db4 both
3 C4 C#4 / Db4 C#4 / Db4 D4 both
4 C#4 / Db4 D4 D4 D#4 / Eb4 both
5 D4 D#4 / Eb4 D#4 / Eb4 E4 both
6 D#4 / Eb4 E4 E4 F4 both
7 E4 F4 F4 A4 both
8 F4 A4 NaN NaN left_only
9 F#4 / Gb4 B4 NaN NaN left_only
10 G4 None NaN NaN left_only
11 NaN NaN G#3 / Ab3 A#3 / Bb3 right_only
12 NaN NaN F#4 / Gb4 B4 right_only
13 NaN NaN G4 None right_only

中间两列已经有了我们想要的。

其他步骤只是提取中间两列并将其重新格式化为您想要的格式,详情如下:

df2只是从合并结果中提取中间的中间2列

然后,我们删除所有具有 None/NaN 值的行(中间 2 列)。

- 替换 NaN 值,然后重命名没有 _x_y 的列。

编辑

代码可以进一步简化,同时输出更类似于所需的输出,如下所示:

(df[['Pitch from dataset']].merge(
df[['Pitch detected']],
left_on='Pitch from dataset',
right_on='Pitch detected',
how='outer')
).dropna(how='all').fillna('-')

请注意,我们在 .merge() 期间的两列中使用双方括号 [[...]] .实际上,我们合并了 2 个数据框,每个数据框只有一列。因此,我们可以省去后续重命名合并列的工作。

结果:

   Pitch from dataset Pitch detected
0 G#3 / Ab3 -
1 A#3 / Bb3 A#3 / Bb3
2 B3 B3
3 C4 C4
4 C#4 / Db4 C#4 / Db4
5 D4 D4
6 D#4 / Eb4 D#4 / Eb4
7 E4 E4
8 F4 F4
9 F#4 / Gb4 -
10 G4 -
11 - A4
12 - B4

关于python - 如何在某些条件下创建 DataFrame 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67137292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com