Pandas 根据条件为列指定值
我正在使用pyspark解析大量数据。我有一个dataframe,它有以下列Pandas 根据条件为列指定值,pandas,apache-spark,dataframe,pyspark,conditional-statements,Pandas,Apache Spark,Dataframe,Pyspark,Conditional Statements,我正在使用pyspark解析大量数据。我有一个dataframe,它有以下列 ip\u地址 device\u id 位置 设备类型 我想创建一个名为id的新列,并将id的相同值分配给满足以下条件之一的列 1) 它们具有相同的设备id和ip\u地址 2) 它们具有相同的设备id,位置和设备类型 3) 它们具有相同的ip\u地址,位置和设备类型 基本上,我希望根据上述条件找到表示相同设备的所有行,并为它们提供相同的id 假设我有以下专栏 +--------+-----------+--------
ip\u地址
device\u id
位置
设备类型
我想创建一个名为id
的新列,并将id
的相同值分配给满足以下条件之一的列
1) 它们具有相同的设备id
和ip\u地址
2) 它们具有相同的设备id
,位置
和设备类型
3) 它们具有相同的ip\u地址
,位置
和设备类型
基本上,我希望根据上述条件找到表示相同设备的所有行,并为它们提供相同的id
假设我有以下专栏
+--------+-----------+------------+-----------+-------------+
|编号|设备| id | ip |地址|位置|设备|类型|
+--------+-----------+------------+-----------+-------------+
|1 |设备1 | ip1 |位置1 |类型1|
|2 |设备1 | ip1 |位置1 |类型1|
|3 |设备1 | ip2 |位置1 |类型1|
|4 |设备2 | ip1 |位置1 |类型1|
|5 |设备3 | ip3 |位置2 |类型2|
+--------+-----------+------------+-----------+-------------+
前4行应分配相同的id
,因为每行满足三个条件之一
第1行和第2行满足条件1
第2行和第3行满足条件2
第3行和第4行满足条件3
所以输出应该是
+--------+-----------+------------+-----------+-------------+----+
|编号|设备| id | ip |地址|位置|设备|类型| id|
+--------+-----------+------------+-----------+-------------+----+
|1 |设备1 | ip1 |位置1 |类型1 | 1|
|2 |设备1 | ip1 |位置1 |类型1 | 1|
|3 |设备1 | ip2 |位置1 |类型1 | 1|
|4 |设备2 | ip1 |位置1 |类型1 | 1|
|5 |设备3 | ip3 |位置2 |类型2 | 2|
+--------+-----------+------------+-----------+-------------+----+
这有可能实现吗?如果是这样,我该怎么做 你可以这样做。不确定这是否是理想的方法,但它确实有效:
df=spark.createDataFrame([
(“1”、“设备1”、“ip1”、“位置1”、“类型1”),
(“2”、“设备1”、“ip1”、“位置1”、“类型1”),
(“3”、“设备1”、“ip2”、“位置1”、“类型1”),
(“4”、“设备2”、“ip1”、“位置1”、“类型1”),
(“5”、“设备3”、“ip3”、“位置2”、“类型2”)
](“ip地址”、“设备id”、“位置”、“设备类型”))
df1=df.groupBy(“设备id”、“ip地址”).agg(最小(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“ip地址”)。别名(“ip”)、列(“最小(列(“编号”))。别名(“id1”))
df2=df.groupBy(“设备id”、“位置”、“设备类型”).agg(最小值(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“数据类型”)、列(“最小值(列)”。别名(“id2”))
df3=df.groupBy(“ip地址”、“位置”、“设备类型”).agg(最小(列(“编号”)))。选择(列(“ip地址”)。别名(“ip”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“d类型”)、列(“最小(列(“编号”)。别名(“id3”))
df.join(df1,[(df1.d\u id==df.device\u id)和(df1.ip==df.ip\u address)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).连接(df2,[(df2.d\u id==df.device\u id)和(df2.l==df.location)和(df2.d\u类型==df.device\u类型)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).join(df3,[(df3.ip==df.ip\u address)和(df3.l==df.location)和(df3.d\u type==df.device\u type)],how=“inner”)。选择(“编号”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”、“id2”、“id3”)。带列(“id”,最少(列(“id1”)、列(“id2”)、列(“id3”)。show()
连接条件表示所需的条件。结果显示在最后的id
列中,如下所示:
+------+---------+----------+---------+-----------+---+---+---+---+
|number|device_id|ip_address| location|device_type|id1|id2|id3| id|
+------+---------+----------+---------+-----------+---+---+---+---+
| 5 | device3 | ip3 |location2| type2 | 5 | 5 | 5 | 5 |
| 3 | device1 | ip2 |location1| type1 | 3 | 1 | 3 | 1 |
| 4 | device2 | ip1 |location1| type1 | 4 | 4 | 1 | 1 |
| 1 | device1 | ip1 |location1| type1 | 1 | 1 | 1 | 1 |
| 2 | device1 | ip1 |location1| type1 | 1 | 1 | 1 | 1 |
+------+---------+----------+---------+-----------+---+---+---+---+
你可以做到。不确定这是否是理想的方法,但它确实有效:
df=spark.createDataFrame([
(“1”、“设备1”、“ip1”、“位置1”、“类型1”),
(“2”、“设备1”、“ip1”、“位置1”、“类型1”),
(“3”、“设备1”、“ip2”、“位置1”、“类型1”),
(“4”、“设备2”、“ip1”、“位置1”、“类型1”),
(“5”、“设备3”、“ip3”、“位置2”、“类型2”)
](“ip地址”、“设备id”、“位置”、“设备类型”))
df1=df.groupBy(“设备id”、“ip地址”).agg(最小(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“ip地址”)。别名(“ip”)、列(“最小(列(“编号”))。别名(“id1”))
df2=df.groupBy(“设备id”、“位置”、“设备类型”).agg(最小值(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“数据类型”)、列(“最小值(列)”。别名(“id2”))
df3=df.groupBy(“ip地址”、“位置”、“设备类型”).agg(最小(列(“编号”)))。选择(列(“ip地址”)。别名(“ip”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“d类型”)、列(“最小(列(“编号”)。别名(“id3”))
df.join(df1,[(df1.d\u id==df.device\u id)和(df1.ip==df.ip\u address)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).连接(df2,[(df2.d\u id==df.device\u id)和(df2.l==df.location)和(df2.d\u类型==df.device\u类型)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).join(df3,[(df3.ip==df.ip\u address)和(df3.l==df.location)和(df3.d\u type==df.device\u type)],how=“inner”)。选择(“编号”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”、“id2”、“id3”)。带列(“id”,最少(列(“id1”)、列(“id2”)、列(“id3”)。show()
工作