pyspark 如何根据多个条件填充Spark dataframe列的行?

cgvd09ve  于 2022-11-21  发布在  Spark
关注(0)|答案(1)|浏览(124)

免责声明:这可能是重复的,但我不能找到确切的解决方案。请随时标记这个问题为重复,并提供链接到重复的问题在评论。
我还在学习python dataframe操作,这可能有一个非常简单的解决方案,我不能弄清楚。
我有一个spark Dataframe ,大约有1200万行,列很少。现在我想根据另外两列的最大值和前一行的派生值来派生一列。
输入-
| A列|B栏|C列|D栏|E列|F列|G列|
| - -|- -|- -|- -|- -|- -|- -|
| 一个|四月|小行星2022|三个|2个|三个|第0页|
| 一个|五月|小行星2022|三个|2个|三个|第0页|
| 一个|六月|小行星2022|三个|一个|一个|第0页|
| 一个|七月|小行星2022|三个|2个|四个|第0页|
| 一个|八月|小行星2022|三个|2个|-1个|第0页|
| 一个|九月|小行星2022|三个|八个|三个|第0页|
| 一个|十月|小行星2022|三个|2个|三个|第0页|
| 一个|十一月|小行星2022|三个|2个|第0页|第0页|
| 一个|十二月|小行星2022|三个|2个|第0页|第0页|
| 一个|扬|小行星2023|三个|2个|六个|第0页|
| 一个|二月|小行星2023|三个|2个|五个|第0页|
| 一个|马尔|小行星2023|三个|2个|六个|第0页|
| 一个|四月|小行星2023|三个|2个|七个|第0页|
| 一个|五月|小行星2023|第0页|第0页|第0页|第0页|
| 2个|四月|二〇一七年|三个|2个|三个|第0页|
| 2个|四月|二〇一七年|三个|2个|三个|第0页|
| 2个|四月|二〇一七年|三个|一个|一个|第0页|
| 2个|四月|二〇一七年|三个|2个|四个|第0页|
| 2个|四月|二〇一七年|三个|2个|-1个|第0页|
| 2个|四月|二〇一七年|三个|七个|三个|第0页|
输出-
| A列|B栏|C列|D栏|E列|F列|G列|H列|逻辑|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|
| 一个|四月|小行星2022|三个|2个|三个|第0页|三个|E列和F列的最大值|
| 一个|五月|小行星2022|三个|2个|三个|第0页|三个|E列和F列的最大值以及H列上一行的输出|
| 一个|六月|小行星2022|三个|一个|一个|第0页|三个|E列和F列的最大值以及H列上一行的输出|
| 一个|七月|小行星2022|三个|2个|四个|第0页|四个|E列和F列的最大值以及H列上一行的输出|
| 一个|八月|小行星2022|三个|2个|-1个|第0页|四个|E列和F列的最大值以及H列上一行的输出|
| 一个|九月|小行星2022|三个|八个|三个|第0页|八个|E列和F列的最大值以及H列上一行的输出|
| 一个|十月|小行星2022|第0页|2个|三个|第0页|八个|E列和F列的最大值以及H列上一行的输出|
| 一个|十一月|小行星2022|第0页|2个|第0页|第0页|八个|E列和F列的最大值以及H列上一行的输出|
| 一个|十二月|小行星2022|第0页|第0页|第0页|第0页|八个|E列和F列的最大值以及H列上一行的输出|
| 一个|扬|小行星2023|第0页|第0页|六个|-3个|六个|如果G列〈0,E列和F列的最大值和(H列前一行的输出+G列)|
| 一个|二月|小行星2023|第0页|2个|五个|第0页|六个|E列和F列的最大值以及H列上一行的输出|
| 一个|马尔|小行星2023|第0页|2个|六个|第0页|六个|E列和F列的最大值以及H列上一行的输出|
| 一个|四月|小行星2023|第0页|第0页|七个|第0页|七个|E列和F列的最大值以及H列上一行的输出|
| 一个|五月|小行星2023|第0页|第0页|第0页|第0页|七个|E列和F列的最大值以及H列上一行的输出|
| 2个|四月|二〇一七年|三个|2个|三个|第0页|三个|E列和F列的最大值|
| 2个|四月|二〇一七年|三个|2个|三个|第0页|三个|E列和F列的最大值以及H列上一行的输出|
| 2个|四月|二〇一七年|三个|一个|一个|第0页|三个|E列和F列的最大值以及H列上一行的输出|
| 2个|四月|二〇一七年|三个|2个|四个|第0页|四个|E列和F列的最大值以及H列上一行的输出|
| 2个|四月|二〇一七年|三个|2个|-1个|第0页|四个|E列和F列的最大值以及H列上一行的输出|
| 2个|四月|二〇一七年|三个|七个|三个|第0页|七个|E列和F列的最大值以及H列上一行的输出|
需要使用以下逻辑创建新列H

  1. Dataframe使用列A中的不同值填充,这些值分布在不同的月份和年份中,并按升序排列。
    1.列A中每个非重复值的第一行必须是列E和F中的最大值
  2. H列的后续行值是E列和F列的最大值以及H列的前一行的值。(当G列〉=0时)
    1.如果列G〈0,则列H为(列E和列F以及(列G +列H的前一行值))的最大值
vi4fp9gy

vi4fp9gy1#

了解,有可能吨类似的问题,但不是exakt你在寻找什么。我希望这有助于:

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO('''
Column A    Column B    Column C    Column D    Column E    Column F    Column G
1   Apr 2022    3   2   3   0
1   May 2022    3   2   3   0
1   Jun 2022    3   1   1   0
1   Jul 2022    3   2   4   0
1   Aug 2022    3   2   -1  0
1   Sep 2022    3   8   3   0
'''), sep="\t")

# Max of Column E and F
df['Column H'] = df.apply(lambda row: max(row.loc['Column E'], row.loc['Column F']), axis=1)

# Helper column (Column H previous row)
df['tmp'] = df['Column H'].shift(1)

# Max of Column E and F and output of Column H previous row
df['Logic'] = df.apply(lambda row: max(row.loc['Column E'], row.loc['Column F'], row.loc['tmp']), axis=1)

# Delete helper
df.drop("tmp", axis=1)

| 索引|A列|B栏|C列|D栏|E列|F列|G列|H列|逻辑|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|- -|
| 第0页|一个|四月|小行星2022|三个|2个|三个|第0页|三个|3.0版本|
| 一个|一个|五月|小行星2022|三个|2个|三个|第0页|三个|3.0版本|
| 2个|一个|六月|小行星2022|三个|一个|一个|第0页|一个|3.0版本|
| 三个|一个|七月|小行星2022|三个|2个|四个|第0页|四个|4.0版本|
| 四个|一个|八月|小行星2022|三个|2个|-1个|第0页|2个|4.0版本|
| 五个|一个|九月|小行星2022|三个|八个|三个|第0页|八个|8.0版本|
如果它不完全是你想要的,它至少应该给予你一些关于如何实现你想要的想法。

相关问题