我有一个看起来像这样的Pandas DataFrame:
| Index | Value |
|-------|--------------|
| 1 | [1, 12, 123] |
| 2 | [12, 123, 1] |
| 3 | [123, 12, 1] |
和我想在第三列后面附加数组元素长度列表:
| Index | Value | Expected_value |
|-------|--------------|----------------|
| 1 | [1, 12, 123] | [1, 2, 3] |
| 2 | [12, 123, 1] | [2, 3, 1] |
| 3 | [123, 12, 1] | [3, 2, 1] |
我尝试使用python lambda函数并映射如下:
dataframe["Expected_value"] = dataframe.value.map(lambda x: len(str(x)))
但没有列表我得到了这些长度的总和:
| Index | Value | Expected_value |
|-------|--------------|----------------|
| 1 | [1, 12, 123] | 6 |
| 2 | [12, 123, 1] | 6 |
| 3 | [123, 12, 1] | 6 |
答案 0 :(得分:3)
您可以将list comprehension
与map
一起使用:
dataframe["Expected_value"] = dataframe.Value.map(lambda x: [len(str(y)) for y in x])
或嵌套列表理解:
dataframe["Expected_value"] = [[len(str(y)) for y in x] for x in dataframe.Value]
对于整数的获取,也可以使用替代方法:
import math
dataframe["Expected_value"] = [[int(math.log10(y))+1 for y in x] for x in dataframe.Value]
print (dataframe)
Index Value Expected_value
0 1 [1, 12, 123] [1, 2, 3]
1 2 [12, 123, 1] [2, 3, 1]
2 3 [123, 12, 1] [3, 2, 1]
答案 1 :(得分:1)
使用列表理解:
[[len(str(y)) for y in x] for x in df['Value'].tolist()]
# [[1, 2, 3], [2, 3, 1], [3, 2, 1]]
df['Expected_value'] = [[len(str(y)) for y in x] for x in df['Value'].tolist()]
df
Index Value Expected_value
0 1 [1, 12, 123] [1, 2, 3]
1 2 [12, 123, 1] [2, 3, 1]
2 3 [123, 12, 1] [3, 2, 1]
如果您需要处理丢失的数据,
def foo(x):
try:
return [len(str(y)) for y in x]
except TypeError:
return np.nan
df['Expected_value'] = [foo(x) for x in df['Value'].tolist()]
df
Index Value Expected_value
0 1 [1, 12, 123] [1, 2, 3]
1 2 [12, 123, 1] [2, 3, 1]
2 3 [123, 12, 1] [3, 2, 1]
在处理对象类型数据时,这可能是性能上最好的。请在For loops with pandas - When should I care?上阅读更多内容。
使用pd.DataFrame
,applymap
和agg
的另一种解决方案:
pd.DataFrame(df['Value'].tolist()).astype(str).applymap(len).agg(list, axis=1)
0 [1, 2, 3]
1 [2, 3, 1]
2 [3, 2, 1]
dtype: object