Python 从数据帧返回值
我有这样的数据帧,有200k到400k行Python 从数据帧返回值,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样的数据帧,有200k到400k行 Index value 1 a 2 3 v 4 5 6 6077 7 8 h 我希望这个dataframe值列根据字符串值的数量用特定的值填充下面所有的行(就像在这个表中,我们有1个字符串值)。 我希望我的数据帧是这样的 Index value 1 a 2 a 3 v 4 v 5 v 6 v 7 v
Index value
1 a
2
3 v
4
5
6 6077
7
8 h
我希望这个dataframe值列根据字符串值的数量用特定的值填充下面所有的行(就像在这个表中,我们有1个字符串值)。
我希望我的数据帧是这样的
Index value
1 a
2 a
3 v
4 v
5 v
6 v
7 v
8 h
如果需要重复长度为
1
的字符串,您可以使用regex[a-zA-Z]{1}
检查长度为1
的字符串,将不匹配的值替换为NaN
s,并使用ffill
向前填充缺失的值:
df['value'] = df['value'].where(df['value'].str.match('^[a-zA-Z]{1}$', na=False)).ffill()
print (df)
Index value
0 1 a
1 2 a
2 3 v
3 4 v
4 5 v
5 6 v
6 7 v
7 8 h
另一个想法是:
m1 = df['value'].str.len().eq(1)
m2 = df['value'].str.isalpha()
df['value'] = df['value'].where(m1 & m2).ffill()
fillna
中的forward fill
方法正是针对这一点的。
这应该适合您:
df.fillna(method='ffill')
试试这个
import pandas as pd
df['value'].replace('\d+', pd.np.nan, regex=True).ffill()
删除所有号码后,请执行以下操作:
df[df['value']==""] = np.NaN
df.fillna(method='ffill')
假设任何不是空字符串或数字的值都应该向前填充,则正则表达式
r'^\d*$”
将同时匹配空字符串或数字。这些值可以替换为np.nan
,然后可以调用ffill
:
import numpy as np
df['value'].replace(r'^\d*$', np.nan, regex=True, inplace=True)
df['value'].ffill(inplace=True)
因此,请删除数字并使用最后一个非空值填充?您是否尝试过lke
df[df['value']='']=np.NaN
然后df.fillna(method='ffill')
?查看索引6中的原始问题,其中包含一个数字,该数字将被视为空字符串,不会向前传播(查看预期输出)。此外,您对fillna
的调用将返回一个未分配给任何内容的新数据帧。此外,您对fillna
的调用将对数据帧的所有单元格进行操作,我认为您不想这样做。1.您假设序列中存在numpy.na
值,但它们是空字符串。2.中的值dex 6是一个数字,应将其视为一个空字符串。3.对fillna
的调用返回一个未分配给任何对象的新数据帧。4.对fillna
的调用将对数据帧的所有单元格进行操作,而您不希望这样做。1.这将仅替换索引6处的值,其他值为empty strings和notnp.nan
.2.从ffill
返回一个新的数据帧,该数据帧没有分配给任何对象。如果您打算将两个或多个字母字符的值视为空字符串,那么您应该调用fullmatch
@Booboo-我的意图是处理长度为1的字符串n您需要使用fullmatch
或使用$
锚定,因为对'xyz'应用的'match('[a-zA-Z]{1}')将返回对第一个字符的命中。
import numpy as np
df['value'].replace(r'^\d*$', np.nan, regex=True, inplace=True)
df['value'].ffill(inplace=True)