让我把这个问题分解成一个更小的部分。我在PySpark,在那里我有一列中的数据帧arrival_date的date格式-
from pyspark.sql.functions import to_date
values = [('22.05.2016',),('13.07.2010',),('15.09.2012',),(None,)]
df = sqlContext.createDataFrame(values,['arrival_date'])
#Following code line converts String into Date format
df = df.withColumn('arrival_date',to_date(col('arrival_date'),'dd.MM.yyyy'))
df.show()
+------------+
|arrival_date|
+------------+
| 2016-05-22|
| 2010-07-13|
| 2012-09-15|
| null|
+------------+
df.printSchema()
root
|-- arrival_date: date (nullable = true)
Run Code Online (Sandbox Code Playgroud)
应用了很多转换到数据帧后,我终于想填充缺少的日期,标记为null有01-01-1900。
执行此操作的一种方法是将列转换arrival_date为String,然后以这种方式替换缺失值 -df.fillna('1900-01-01',subset=['arrival_date'])最后重新转换此列to_date。这是非常不雅观的。
下面的代码行不起作用,正如预期的那样,我收到一个错误 -
df = df.fillna(to_date(lit('1900-01-01'),'yyyy-MM-dd'), subset=['arrival_date'])
Run Code Online (Sandbox Code Playgroud)
文档说值必须是以下类型:Int、Long、Float、Double、String、Boolean。
另一种方法是使用withColumn()和when()-
df = …Run Code Online (Sandbox Code Playgroud) 这里也有人问过类似的问题,但它没有正确解决我的问题。我有近 100 个数据帧,每个数据帧至少有200,000行,我需要通过full基于列进行连接来加入它们ID,从而创建一个带有列的数据帧 - ID, Col1, Col2,Col3,Col4, Col5..., Col102。
只是为了说明,我的 DataFrames 的结构 -
df1 = df2 = df3 = ..... df100 =
+----+------+------+------+ +----+------+ +----+------+ +----+------+
| ID| Col1| Col2| Col3| | ID| Col4| | ID| Col5| | ID|Col102|
+----+------+-------------+ +----+------+ +----+------+ +----+------+
| 501| 25.1| 34.9| 436.9| | 501| 22.33| | 503| 22.33| | 501| 78,1|
| 502| 12.2|3225.9| 46.2| | 502| 645.1| | 505| 645.1| | 502| 54.9| …Run Code Online (Sandbox Code Playgroud) 我想用另一个值替换数据框列中的一个值,并且我必须为许多列(假设为 30/100 列)执行此操作
from pyspark.sql.functions import when, lit, col
df = sc.parallelize([(1, "foo", "val"), (2, "bar", "baz"), (3, "baz", "buz")]).toDF(["x", "y", "z"])
df.show()
# I can replace "baz" with Null separaely in column y and z
def replace(column, value):
return when(column != value, column).otherwise(lit(None))
df = df.withColumn("y", replace(col("y"), "baz"))\
.withColumn("z", replace(col("z"), "baz"))
df.show()
Run Code Online (Sandbox Code Playgroud)
我可以在 y 和 z 列中分别用 Null 替换“baz”。但我想对所有列都这样做 - 类似于下面的列表理解方式
[replace(df[col], "baz") for col in df.columns]
Run Code Online (Sandbox Code Playgroud) 我有一个PySpark DataFrame-
valuesCol = [('Sweden',31),('Norway',62),('Iceland',13),('Finland',24),('Denmark',52)]
df = sqlContext.createDataFrame(valuesCol,['name','id'])
+-------+---+
| name| id|
+-------+---+
| Sweden| 31|
| Norway| 62|
|Iceland| 13|
|Finland| 24|
|Denmark| 52|
+-------+---+
Run Code Online (Sandbox Code Playgroud)
我希望在此DataFrame中添加一行列,这是该行的行号(序列号),如下所示-
我的最终输出应该是:
+-------+---+--------+
| name| id|row_num |
+-------+---+--------+
| Sweden| 31| 1|
| Norway| 62| 2|
|Iceland| 13| 3|
|Finland| 24| 4|
|Denmark| 52| 5|
+-------+---+--------+
Run Code Online (Sandbox Code Playgroud)
我的Spark版本是 2.2
我正在尝试此代码,但无法正常工作-
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
w = Window().orderBy()
df = df.withColumn("row_num", row_number().over(w))
df.show()
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
AnalysisException: 'Window function row_number() requires window to be …Run Code Online (Sandbox Code Playgroud) 我有一个PySpark DataFrame。如何从name下面的栏中删除/删除最后5个字符-
from pyspark.sql.functions import substring, length
valuesCol = [('rose_2012',),('jasmine_2013',),('lily_2014',),('daffodil_2017',),('sunflower_2016',)]
df = sqlContext.createDataFrame(valuesCol,['name'])
df.show()
+--------------+
| name|
+--------------+
| rose_2012|
| jasmine_2013|
| lily_2014|
| daffodil_2017|
|sunflower_2016|
+--------------+
Run Code Online (Sandbox Code Playgroud)
我想创建2列,flower和year列。
预期产量:
+--------------+----+---------+
| name|year| flower|
+--------------+----+---------+
| rose_2012|2012| rose|
| jasmine_2013|2013| jasmine|
| lily_2014|2014| lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|subflower|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)
year 我创建的列-
df = df.withColumn("year", substring(col("name"),-4,4))
df.show()
+--------------+----+
| name|year|
+--------------+----+
| rose_2012|2012|
| jasmine_2013|2013|
| lily_2014|2014|
| daffodil_2017|2017|
|sunflower_2016|2016|
+--------------+----+
Run Code Online (Sandbox Code Playgroud)
我不知道怎么砍最后五个字符,所以我只有花的名字。我通过调用尝试了类似的方法length,但这不起作用。
df …Run Code Online (Sandbox Code Playgroud) 我有一个 DataFrame,我想将其转换为以下内容:
import pandas as pd
df = pd.DataFrame({'ID':[111,111,111,222,222,333],
'class':['merc','humvee','bmw','vw','bmw','merc'],
'imp':[1,2,3,1,2,1]})
print(df)
ID class imp
0 111 merc 1
1 111 humvee 2
2 111 bmw 3
3 222 vw 1
4 222 bmw 2
5 333 merc 1
Run Code Online (Sandbox Code Playgroud)
期望的输出:
ID 0 1 2
0 111 merc humvee bmw
1 111 1 2 3
2 222 vw bmw
3 222 1 2
4 333 merc
5 333 1
Run Code Online (Sandbox Code Playgroud)
我希望transpose整个数据框,但grouped by一个特定的列,ID在这种情况下,并维护行order。
我的尝试:我尝试使用 …
我有一个数据框,其中包含欧洲格式的数字,我已将其导入为字符串。逗号为小数,反之亦然-
from pyspark.sql.functions import regexp_replace,col
from pyspark.sql.types import FloatType
df = spark.createDataFrame([('-1.269,75',)], ['revenue'])
df.show()
+---------+
| revenue|
+---------+
|-1.269,75|
+---------+
df.printSchema()
root
|-- revenue: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
所需的输出: df.show()
+---------+
| revenue|
+---------+
|-1269.75|
+---------+
df.printSchema()
root
|-- revenue: float (nullable = true)
Run Code Online (Sandbox Code Playgroud)
我正在使用函数regexp_replace先用空白替换点 -然后用逗号替换空白点,最后转换为floatType。
df = df.withColumn('revenue', regexp_replace(col('revenue'), ".", ""))
df = df.withColumn('revenue', regexp_replace(col('revenue'), ",", "."))
df = df.withColumn('revenue', df['revenue'].cast("float"))
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在下面替换时,我得到了空字符串。为什么??我在期待-1269,75。
df = df.withColumn('revenue', regexp_replace(col('revenue'), ".", ""))
+-------+
|revenue|
+-------+
| …Run Code Online (Sandbox Code Playgroud) 我希望SQL在 Python 中有一个样式聚合。
# Example DataFrame
df = pd.DataFrame({'ID':[1,1,2,2,2],
'revenue':[1,3,5,1,5],
'month':['2012-01-01','2012-01-01','2012-03-01','2014-01-01','2012-01-01']})
print(df)
ID month revenue
0 1 2012-01-01 1
1 1 2012-01-01 3
2 2 2012-03-01 5
3 2 2014-01-01 1
4 2 2012-01-01 5
Run Code Online (Sandbox Code Playgroud)
现在,我想计算出总revenue的唯一编号months和第一month每一个ID。我得到了我想要的数字,但不是列名样式,因为它们分布在两行中。
df = df.groupby(['ID']).agg({'revenue':'sum','month':['nunique','first']}).reset_index()
print(df)
ID revenue month
sum nunique first
0 1 4 1 2012-01-01
1 2 11 3 2012-03-01
Run Code Online (Sandbox Code Playgroud)
普通的 SQL 脚本类似于以下伪代码 -
select ID, sum(revenue) as revenue, count(month) as distinct_m, first(month) as …Run Code Online (Sandbox Code Playgroud) 我正在使用 python docx 库写入 .docx 文件。我想预先指定特定句子的字体大小和颜色。我的问题是我无法同时进行。我来举例说明——
from docx import Document
from docx.shared import Pt #Helps to specify font size
from docx.shared import RGBColor #Helps to specify font Color
document=Document() #Instantiation
p=document.add_heading(level=0)
p.add_run('I want this sentence colored red with fontsize=22').font.size=Pt(22) #Specifies fontsize 22
p.add_run('This line gets colored red').font.color.rgb=RGBColor(255,0,0) #Specifies RED color
document.save('path/file.docx')
Run Code Online (Sandbox Code Playgroud)
我很清楚地知道,我设置的颜色Red第二句,既然有一个=前Pt(22)和RGBColor(255,00)这样我就可以不适用fontsize,并color同时
有没有办法同时应用这两个属性?
编辑:我想要I want this sentence colored red with fontsize=22红色的线条。
我有一个这样的数据框
data = [(("ID1", "A", 1)), (("ID1", "B", 5)), (("ID2", "A", 12)),
(("ID3", "A", 3)), (("ID3", "B", 3)), (("ID3", "C", 5)), (("ID4", "A", 10))]
df = spark.createDataFrame(data, ["ID", "Type", "Value"])
df.show()
+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID1| A| 1|
|ID1| B| 5|
|ID2| A| 12|
|ID3| A| 3|
|ID3| B| 3|
|ID3| C| 5|
|ID4| A| 10|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)
我只想提取那些只包含一种特定类型 - “A”的行(或 ID)
因此我的预期输出将包含以下行
+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID2| A| 1|
|ID4| A| 10|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)
对于每个 ID 可以包含任何类型 - A、B、C 等。我想提取那些包含一个且仅包含一个类型的 ID …
我有一个dictionary-
d={'revenues':
{
'201907':
{'aaa.csv':'fdwe34x2'},
'201906':{'ddd.csv':'e4c5q'}
},
'complaints':
{'2014':
{'sfdwa.csv','c2c2jh'}
}
}
Run Code Online (Sandbox Code Playgroud)
我想把它转换list成tuples-
[
('revenues','201907','aaa.csv','fdwe34x2'),
('revenues','201906','ddd.csv','e4c5q'),
('complaints','2014','sfdwa.csv','c2c2jh')
]
Run Code Online (Sandbox Code Playgroud)
我尝试使用list comprehensions,但没有帮助 -
l = [(k,[(p,q) for p,q in v.items()]) for k,v in d.items()]
print(l)
[('revenues', [('201907', {'aaa.csv': 'fdwe34x2'}), ('201906', {'ddd.csv': 'e4c5q'})]),
('complaints', [('2014', {'c2c2jh', 'sfdwa.csv'})])]
Run Code Online (Sandbox Code Playgroud)
有什么建议么?
我有两个DataFrames,其中一个是单排DataFrame。我想dataframe在较大的所有行中添加一行。我可以解决它,但我正在寻找一个更简单的解决方案:
import pandas as pd
df1 = pd.DataFrame({'C':['car'],'D':['bus']})
print(df1)
C D
0 car bus
df2 = pd.DataFrame({'A':[1,2,3],'B':[8,2,0]})
print(df2)
A B
0 1 8
1 2 2
2 3 0
Run Code Online (Sandbox Code Playgroud)
我想将 DataFrame 线与较大的线连接起来。结果应该是。
A B C D
0 1 8 car bus
1 2 2 car bus
2 3 0 car bus
Run Code Online (Sandbox Code Playgroud)
我的尝试:我dummy在两个 DataFrames 中都创建了一个列并做了一个left join,但这很不雅。我相信会有更简单的解决方案。
python ×10
dataframe ×6
pyspark ×6
apache-spark ×4
pandas ×4
colors ×1
date ×1
fillna ×1
font-size ×1
fonts ×1
python-docx ×1
replace ×1
replaceall ×1
row-number ×1
substring ×1
tuples ×1