我有dataframe
,看起来像这样。
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
2 567 B- NaN
3 GHI 890 D
但是我想通过检查(col['Name'])
到下一个列(col['Val'])
并依次进行移位来移动数据。另外,如果发生移位,请更改行index
的值。我想要以下dataframe
作为输出。
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
NaN 567 B -
2 GHI 890 D
有人知道该怎么做吗?
答案 0 :(得分:5)
您可以按布尔掩码移动行:
mask = pd.to_numeric(df['Name'], errors='coerce').notnull()
df[mask] = df[mask].shift(axis=1)
print (df)
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
2 NaN 567 B-
3 GHI 890 D
详细信息:
print (pd.to_numeric(df['Name'], errors='coerce'))
0 NaN
1 NaN
2 567.0
3 NaN
Name: Name, dtype: float64
如果确实需要将索引值替换为empty
字符串,则可以创建助手Series
和reindex
。
但是不建议这样做,因为性能问题和可能与此索引有关的某些功能应该失败。
i = df.index[~mask]
df.index = pd.Series(range(len(i)), index=i).reindex(df.index, fill_value='')
print (df)
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
NaN 567 B-
2 GHI 890 D
答案 1 :(得分:3)
df[df['Rating'].isnull()]=df[df['Rating'].isnull()].shift(axis=1)
print(df)
输出:
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
2 NaN 567 B-
3 GHI 890 D
df[df['Rating'].isnull()|df['Name'].isnull()]=df[df['Rating'].isnull()|df['Name'].isnull()].shift(axis=1)
print(df)
答案 2 :(得分:1)
使用isdigit
:
df[df['Name'].str.isdigit()] = df[df['Name'].str.isdigit()].shift(axis=1)
输出:
Name Val Rating
0 ABC 123 B +
1 DEF 234 B +
2 NaN 567 B-
3 GHI 890 D
答案 3 :(得分:-2)
import numpy as np
def f1(row):
if not row.rating:
row.Rating = row.val
row.val = row.Name
row.Name = np.NaN
pandas.DataFrame.apply
:df.apply(f1,axis=1)