我有一个数据帧df1:
df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan})
如果在DF_1A中是数字(同一行),我必须为DF_3B分配值 我有A以上然后值是100而B是200。 毕竟这个表应该是这样的:
编辑:
所以我试着以另一种方式解释它。
循环通过DF_1A列。让该循环的每个元素都是x。然后:
- 如果x是一个字母什么都不做
- 如果x是数值,则有两种可能性
a)如果x之上的一行的值是字母,则在同一行中的DF_3B栏中指定字母(100或200)的等效值,其中x为
b)如果x之上的一行的值是数字,则在同一行中的DF_3B列中的一行上分配值DF_3B,其中x是
或许还有另一种更简单的方法?
谢谢你, 亚雷克
答案 0 :(得分:1)
不是最佳解决方案,但这可行:
d1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5,6], 'DF_1B' : [10, 25, 40, 10, 15,12],'DF_3B' : np.nan})
d1['temp'] = np.where(d1['DF_1A'].shift(1)=='A',1,2)
d1['DF_3B'] = np.where(d1['DF_1A'].str.isdigit(),100,np.nan)*d1['temp']
d1.drop('temp',axis=1, inplace=True)
d1.head()
答案 1 :(得分:1)
解决问题的另一种方法。您没有指定存储替换值的方式,所以我假设了一个字典:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(data = {'DF_1A' : ["A", 2, "B", 4, 5, 6, "A", 8, 9, 10], 'DF_1B' : [10, 25, 40, 10, 15, 12, 1, 3.7, 5, -2], 'DF_3B' : np.nan})
#transcription dictionary
transcr = {"A": 100, "B": 200}
#transfer values from row DF_1A to DF_3B, if they are in the dictionary
df1["DF_3B"] = df1.loc[df1["DF_1A"].isin(transcr), "DF_1A"]
#forward filling and substition of letters with values
df1["DF_3B"] = df1["DF_3B"].fillna(method='ffill').replace(transcr)
#resetting rows that contain letters to NaN
df1.loc[df1["DF_1A"].isin(transcr), "DF_3B"] = np.nan
print(df1)
输出
DF_1A DF_1B DF_3B
0 A 10.0 NaN
1 2 25.0 100.0
2 B 40.0 NaN
3 4 10.0 200.0
4 5 15.0 200.0
5 6 12.0 200.0
6 A 1.0 NaN
7 8 3.7 100.0
8 9 5.0 100.0
9 10 -2.0 100.0